Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代元组列表_Python_Loops_Iteration - Fatal编程技术网

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
on
sorted(li,key=lambda x:(x[1],x[0])
@pault上述解决方案是
O(N)
。排序的
O(N log N)
。我不喜欢
groupby
提供的不同寻常的界面迫使我使用我并不真正需要的
O(N log N)
排序。但是,也可以使用排序的
。顺便说一下,这次,
itemgetter(1,0)
肯定会更短;)我忘了您可以将多个参数传递给
itemgetter