Python 将列表中具有相同模式的元素组合为字符串
我有一个字符串列表,这些字符串的模式可能会有所不同Python 将列表中具有相同模式的元素组合为字符串,python,Python,我有一个字符串列表,这些字符串的模式可能会有所不同 lst = ['ban-eur.kd', 'ban-eur.sd', 'ban-eur.td' ] 转换后应成为ban eur 只有在可以组合的情况下,才应该组合下一个元素。(仅当它与模式相匹配时ban eur) 这将导致'ban-eur.kd\u kd\u ban-eur. 如果它没有任何可以组合的元素,那么应该使用\uuuu 如何做到这一点,而不丢失数组中的第一个元素/字符串中的重复 谢谢您的时间。您可以使用itertools.group
lst = ['ban-eur.kd', 'ban-eur.sd', 'ban-eur.td' ]
转换后应成为ban eur
只有在可以组合的情况下,才应该组合下一个元素。(仅当它与模式相匹配时ban eur
)
这将导致'ban-eur.kd\u kd\u ban-eur.
如果它没有任何可以组合的元素,那么应该使用\uuuu
如何做到这一点,而不丢失数组中的第一个元素/字符串中的重复
谢谢您的时间。您可以使用
itertools.groupby
:
import itertools, re
lst = ['ban-eur.kd', 'ban-eur.sd', 'ban-eur.td' ]
def group_result(d:list) -> list:
if len(d) == 1:
return d[0]
new_result = [[a, list(b)] for a, b in itertools.groupby(sorted(d, key=lambda x:x.split('.')[0]), key=lambda x:x.split('.')[0])]
return '_'.join('{}<{}>'.format(a, ','.join(i.split('.')[-1] for i in b)) for a, b in new_result)
new_data = '_'.join(group_result(list(b)) if a else '_'.join(list(b)) for a, b in itertools.groupby(lst, key=lambda x:'.' in x))
这应该行得通
pre = ''
result = []
endings = []
for item in lst:
if item.split('.')[0] == pre:
endings.append(item.split('.')[1])
else:
if endings:
result.append(pre+'<'+','.join(endings)+'>')
else:
result.append(item)
pre = item.split('.')[0]
endings = []
print('_'.join(result))
pre=''
结果=[]
结尾=[]
对于lst中的项目:
如果项.split('.')[0]==pre:
endings.append(item.split('.')[1])
其他:
如果结尾:
结果。追加(前+“”)
其他:
结果。追加(项)
pre=项目分割('.')[0]
结尾=[]
打印(“连接”(结果))
匹配=[]
结果字符串
对于lst中的项目:
如果项目开始使用('ban-eur'):
匹配项。追加(项)
elif非项目。起始值为('ban-eur')且长度(匹配项)>=1:
如果len(匹配)=1:
结果字符串+=项
其他:
结果_字符串+='禁止欧元'
匹配项=[]
结果_字符串+=''+项+'''
您的缩进有点小off@Ajax1234,我不明白你的方法(d:list)->list。您能解释一下吗?我认为它适用于3版及以上版本。但不适用于2.7。@Ajax1234
'ban-eur<kd,sd,td>'
'ban-eur.kd_kd_ban-eur<sd,td>'
pre = ''
result = []
endings = []
for item in lst:
if item.split('.')[0] == pre:
endings.append(item.split('.')[1])
else:
if endings:
result.append(pre+'<'+','.join(endings)+'>')
else:
result.append(item)
pre = item.split('.')[0]
endings = []
print('_'.join(result))
matches = []
resulting_string
for item in lst:
if item.startsWith('ban-eur'):
matches.append(item)
elif not item.startsWith('ban-eur') and len(matches) >= 1:
if len(matches) == 1:
resulting_string += item
else:
resulting_string += 'ban-eur.<'
for s in matches:
resulting_string += s + ', '
resulting_string += '>'
matches = []
resulting_string += '_' + item + '_'