簡體   English   中英

Python按具有相同屬性的列表中的相鄰項目分組

[英]Python group by adjacent items in a list with same attributes

請參見簡化示例:

A=[(721,'a'),(765,'a'),(421,'a'),(422,'a'),(106,'b'),(784,'a'),(201,'a'),(206,'b'),(207,'b')]

我希望將相鄰的元組以屬性“ a”進行分組,每兩對為一個,而將元組單獨為“ b”。

所以所需的元組看起來像:

 A=[[(721,'a'),(765,'a')],
    [(421,'a'),(422,'a')],
    [(106,'b')],
    [(784,'a'),(201,'a')],
    [(206,'b')],[(207,'b')]]

我可以做的是建立兩個單獨的列表,其中包含帶有ab元組。

然后,一對元組a ,並加回。 但這似乎不是很有效。 有更快,更簡單的解決方案嗎?

您可以使用itertools.groupby

import itertools
A=[(721,'a'),(765,'a'),(421,'a'),(422,'a'),(106,'b'),(784,'a'),(201,'a'),(206,'b'),(207,'b')]
def split(s):
  return [s[i:i+2] for i in range(0, len(s), 2)]

new_data = [i if isinstance(i, list) else [i] for i in list(itertools.chain(*[split(list(b)) if a == 'a' else list(b) for a, b in itertools.groupby(A, key=lambda x:x[-1])]))

輸出:

[[(721, 'a'), (765, 'a')], [(421, 'a'), (422, 'a')], [(106, 'b')], [(784, 'a'), (201, 'a')], [(206, 'b')], [(207, 'b')]]

假設a項目總是成對存在,一種簡單的方法如下。

查看第一個項目-如果它是a ,則將其與下一個項目成對使用。 否則,只需使用單個項目。 然后視情況“向前”跳1或2:

A=[(721,'a'),(765,'a'),(421,'a'),(422,'a'),(106,'b'),(784,'a'),(201,'a'),(206,'b'),(207,'b')]

result = []
count = 0
while count <= len(A)-1:
    if A[count][1] == 'a':
        result.append([A[count], A[count+1]])
        count += 2
    else:
        result.append([A[count]])
        count += 1

print(result)

無需使用兩個列表。 編輯:如果不假定'a'總是成對出現/相鄰

A = [(721,'a'),(765,'a'),(421,'a'),(422,'a'),(106,'b'),(784,'a'),(201,'a'),(206,'b'),(207,'b')]
new_list = []
i = 0
while i < len(A):
    if i == len(A)-1:
        new_list.append([A[i]])
        i+=1
    elif (A[i][1]==A[i+1][1]=='a') :
        new_list.append([A[i], A[i+1]])
        i += 2
    else:
        new_list.append([A[i]])
        i += 1
print(new_list)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM