Python 迭代元组列表
我真的很感激你能为我的问题提供一些意见,因为我似乎无法让它发挥作用。我需要迭代元组列表,例如:Python 迭代元组列表,python,loops,iteration,Python,Loops,Iteration,我真的很感激你能为我的问题提供一些意见,因为我似乎无法让它发挥作用。我需要迭代元组列表,例如: li = [('a',1),('b',2),('c', 2),('d', 2), ('e', 3), ('f', 3), ('g', 1)] 并希望得到如下结果: new_li = [('a', 1), ('bcd',2), ('ef',3), ('g',1)] 其中,我基于元组中的第二个值连接字符串。我不想使用itertools中的groupby,因为即使g与1关联,它也不会紧靠a。 谢谢你的回
li = [('a',1),('b',2),('c', 2),('d', 2), ('e', 3), ('f', 3), ('g', 1)]
并希望得到如下结果:
new_li = [('a', 1), ('bcd',2), ('ef',3), ('g',1)]
其中,我基于元组中的第二个值连接字符串。我不想使用itertools
中的groupby
,因为即使g
与1
关联,它也不会紧靠a
。
谢谢你的回复 IIUC,您可以使用itertools.groupby
按顺序分组:
例如:
from itertools import groupby
new_li = [
("".join(y[0] for y in g), x) for x, g in groupby(li, key=lambda x: x[1])
]
print(new_li)
#[('a', 1), ('bcd', 2), ('ef', 3), ('g', 1)]
groupby
的keyfunc从每个元组中获取数字。然后,对于每个组,您可以使用str.join
将字母连接在一起 根据您对为什么不想使用groupby
的描述,我推断您实际上希望a
和g
组合在一起。所以不妨试试这个:
li = [('a',1),('b',2),('c', 2),('d', 2), ('e', 3), ('f', 3), ('g', 1)]
from collections import defaultdict
d = defaultdict(list)
for c,i in li:
d[i].append(c)
new_li = [(''.join(cs), i) for (i, cs) in d.items()]
print(new_li)
# output: [('ag', 1), ('bcd', 2), ('ef', 3)]
我不明白为什么不能使用itertools。groupby-不能
[(“”.join([y[0]表示列表中的y(g)]),x)表示x,g表示groupby(li,key=lambda x:x[1])]
生成所需的输出?是的groupby只对相似的顺序值进行分组@保罗,你应该把我不懂的东西贴出来。如果你想把a
和g
分开,那么你想要的正是groupby
所做的吗?谢谢@AndreyTyukin,@pault。这正是我想要的——我误解了groupby
的工作原理,但现在它清楚多了!使用itertools import itemgetter中的可以将lambda x:x[1]
替换为itemgetter(1)
。诚然,在这种情况下不会短得多……如果我没有弄错的话,如果这是所需的输出,您也可以只应用itertools.groupby
onsorted(li,key=lambda x:(x[1],x[0])
@pault上述解决方案是O(N)
。排序的是O(N log N)
。我不喜欢groupby
提供的不同寻常的界面迫使我使用我并不真正需要的O(N log N)
排序。但是,也可以使用排序的。顺便说一下,这次,itemgetter(1,0)
肯定会更短;)我忘了您可以将多个参数传递给itemgetter
!