'聚集'Python中的列表

时间:2018-07-18 15:27:33

标签: python

我一直在尝试“聚集”列表

  

我的意思是根据它们之间的项目将各个项目放在一起,因此service cloud.firestore { match /databases/{database}/documents { // Match any document in the 'cities' collection match /cities/{city} { allow read: if false; allow write: if false; } } } ['d','-','g','p','q','-','a','v','i']周围“聚集”时变成['d-g','p','q-a','v','i']

这是我的尝试:

'-'

但是,它输出(对于上面的示例)

def clump(List):
    box = []
    for item in List:
        try:
            if List[List.index(item) + 1] == "-":
                box.append("".join(List[List.index(item):List.index(item)+3]))
            else:
                box.append(item)

        except:
            pass

    return box

我不知道如何跳过接下来的两项

此外,代码是一团糟,主要是由于try和except语句(我使用它,否则当到达最后一项时我得到一个['d-g', '-', 'g', 'p', 'q-a', '-', 'a', 'v']

如何解决(或完全重写)?

谢谢

3 个答案:

答案 0 :(得分:5)

这是一个O(n)解决方案,该解决方案维护一个标志来确定您当前是否拥挤。然后根据以下条件操纵列表中的最后一项:

def clump(arr):
     started = False
     out = []
     for item in arr:
         if item == '-':
             started = True
             out[-1] += item
         elif started:
             out[-1] += item
             started = False
         else:
              out.append(item)
     return out

实际情况:

In [53]: clump(x)
Out[53]: ['d-g', 'p', 'q-a', 'v', 'i']

如果列表中的第一项是破折号,则此解决方案将失败,但这似乎应该是无效的输入。

答案 1 :(得分:4)

这是使用re.sub

的解决方案
>>> import re
>>> l = ['d','-','g','p','q','-','a','v','i']
>>> re.sub(':-:', '-', ':'.join(l)).split(':')
['d-g', 'p', 'q-a', 'v', 'i']

答案 2 :(得分:0)

这是使用itertools.zip_longest

的另一种解决方案
>>> from itertools import zip_longest
>>> l = ['d','-','g','p','q','-','a','v','i']
>>> [x+y+z if y=='-' else x for x,y,z in zip_longest(l, l[1:], l[2:], fillvalue='') if '-' not in [x,z]]
['d-g', 'g', 'q-a', 'a', 'v', 'i']