在Python中对元素进行分组的list方法
谢谢你的回答,但我编辑了我的问题,因为它不是所有人都清楚。 我有以下元组列表:在Python中对元素进行分组的list方法,python,list,group-by,tuples,itertools,Python,List,Group By,Tuples,Itertools,谢谢你的回答,但我编辑了我的问题,因为它不是所有人都清楚。 我有以下元组列表: [("ok",1),("yes",1),("no",0),("why",1),("some",1),("eat",0),("give",0),("about",0),("tell",1),("ask",0),("be",0)] 我希望: [("ok yes","no"),("why some","eat give about"),("tell","ask be")] 谢谢大家! 因此,我想重新组合所有1,当出现0
[("ok",1),("yes",1),("no",0),("why",1),("some",1),("eat",0),("give",0),("about",0),("tell",1),("ask",0),("be",0)]
我希望:
[("ok yes","no"),("why some","eat give about"),("tell","ask be")]
谢谢大家!
因此,我想重新组合所有1,当出现0时,我在列表中添加该值,并为下一个值创建一个新元素。根据我的理解,以下代码应该适用于上述问题
list_tuples = [("ok",1),("yes",1),("no",0),("why",1),("some",1),("eat",0)]
tups=[]
updated_list=[]
for elem in list_tuples:
if elem[1] == 0:
updated_list.append(tuple([' '.join(tups), elem[0]]))
tups=[]
else:
tups.append(elem[0])
print updated_list
一种可能的解决方案是使用
itertools.groupby
:
from operator import itemgetter
from itertools import groupby
lst = [("ok",1), ("yes",1), ("no",0), ("why",1), ("some",1), ("eat",0)]
def generate(lst):
rv = []
for v, g in groupby(lst, itemgetter(1)):
if v:
rv.append(' '.join(map(itemgetter(0), g)))
else:
for i in g:
rv.append(i[0])
yield tuple(rv)
rv = []
# yield last item if==1:
if v:
yield tuple(rv)
print([*generate(lst)])
from itertools import groupby
d = [("ok",1),("yes",1),("no",0),("why",1),("some",1),("eat",0),("give",0),("about",0),("tell",1),("ask",0),("be",0)]
new_d = [' '.join(j for j, _ in b) for _, b in groupby(d, key=lambda x:x[-1])]
result = [(new_d[i], new_d[i+1]) for i in range(0, len(new_d), 2)]
印刷品:
[('ok yes', 'no'), ('why some', 'eat')]
您可以使用
itertools.groupby
:
from operator import itemgetter
from itertools import groupby
lst = [("ok",1), ("yes",1), ("no",0), ("why",1), ("some",1), ("eat",0)]
def generate(lst):
rv = []
for v, g in groupby(lst, itemgetter(1)):
if v:
rv.append(' '.join(map(itemgetter(0), g)))
else:
for i in g:
rv.append(i[0])
yield tuple(rv)
rv = []
# yield last item if==1:
if v:
yield tuple(rv)
print([*generate(lst)])
from itertools import groupby
d = [("ok",1),("yes",1),("no",0),("why",1),("some",1),("eat",0),("give",0),("about",0),("tell",1),("ask",0),("be",0)]
new_d = [' '.join(j for j, _ in b) for _, b in groupby(d, key=lambda x:x[-1])]
result = [(new_d[i], new_d[i+1]) for i in range(0, len(new_d), 2)]
输出:
[('ok yes', 'no'), ('why some', 'eat give about'), ('tell', 'ask be')]
我认为你应该先尝试一个解决方案,然后指出你的困境。