请参阅简化示例:
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
中对元组进行配对,然后重新添加。但似乎效率不高。任何更快速和简单的解决方案?
答案 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)