Python组由具有相同属性的列表中的相邻项组成

时间:2018-03-21 14:35:32

标签: python list

请参阅简化示例:

ALTER TABLE news ADD COLUMN document tsvector;

UPDATE news SET document = to_tsvector(coalesce(title,'') || ' ' || coalesce(content,''));

CREATE INDEX idx_fts_search ON news USING gin(document);
SELECT title, content FROM news WHERE document @@ to_tsquery('Travel | Cure');

我希望群组相邻的元组具有属性' a',每两对明智,并留下元组' b'单独

所以想要的元组看起来像:

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

我可以做的是构建两个单独的列表,其中包含 A=[[(721,'a'),(765,'a')], [(421,'a'),(422,'a')], [(106,'b')], [(784,'a'),(201,'a')], [(206,'b')],[(207,'b')]] a的元组。

然后在b中对元组进行配对,然后重新添加。但似乎效率不高。任何更快速和简单的解决方案?

3 个答案:

答案 0 :(得分:2)

您可以使用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')]]

答案 1 :(得分:2)

假设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)

答案 2 :(得分:0)

无需使用两个列表。编辑:如果&#39; a&#39;不被认为总是成对/相邻

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)