Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表中具有相同模式的元素组合为字符串_Python - Fatal编程技术网

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 + '_'