gpt4 book ai didi

python 2.7 : efficiently reformat list of tuples

转载 作者:行者123 更新时间:2023-11-28 20:40:39 24 4
gpt4 key购买 nike

我想重新格式化以下列表,其中包含具有整数(在某些元组之间共享)和字符串(每个元组具有特殊性)的元组

mylist = [(8, 'dddd'), (8, '33333'), (8, 'fdsss'), (9, 'fsfjs'),(10, 'dddd'), (10, '33333'), (12, 'fdsss'), (12, 'fsfjs')]

这样每个元组都包含一个整数和属于它的所有字符串的串联字符串,如下所示:

mynewlist = [(8, 'dddd, 33333, fdsss'), (9, 'fsfjs'),(10, 'dddd, 333333'), (12, 'fdsss, fsfjs')

经过深思熟虑,我想到的最简约的解决方案是简单地遍历所有元组并连接字符串,直到整数与下一个不匹配:

mynewlist = []
label = ''
for i in range(len(mylist)-1):
if mylist[i][0] != mylist[i+1][0]:
mynewlist.append(tuple([mylist[i][0], label + mylist[i][1]]))
label = ''
else:
label = label + mylist[i][1] + ','

这很好用。但是,我想知道是否有更有效/Pythonic 的方式来生成列表。我考虑过使用列表理解,但这不允许我在不遍历整个列表的情况下选择字符串;列表理解需要为每个唯一的整数运行,这看起来很浪费。我还考虑过通过索引预先选择与唯一整数关联的字符串,但这对我来说似乎很不符合 Pythonic。

非常感谢您的建议。谢谢!

最佳答案

你可以使用 itertools.groupby()在这里进行分组:

from itertools import groupby
from operator import itemgetter

mynewlist = [
(key, ', '.join([s for num, s in group]))
for key, group in groupby(mylist, itemgetter(0))]

这使用 list comprehensions处理每个组并从分组的元组中提取字符串以进行连接。 operator.itemgetter() object告诉 groupby() 对第一个元素的输入进行分组:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> mylist = [(8, 'dddd'), (8, '33333'), (8, 'fdsss'), (9, 'fsfjs'),(10, 'dddd'), (10, '33333'), (12, 'fdsss'), (12, 'fsfjs')]
>>> [(key, ', '.join([s for num, s in group])) for key, group in groupby(mylist, itemgetter(0))]
[(8, 'dddd, 33333, fdsss'), (9, 'fsfjs'), (10, 'dddd, 33333'), (12, 'fdsss, fsfjs')]

请注意,groupby() 迭代器仅对连续 匹配元素进行分组。这意味着如果您的输入没有排序,那么具有相同初始元素的元组也不一定总是放在一起。如果您的输入未排序,并且您需要对所有具有相同起始元素的元组进行分组,而不管它们在输入序列中的什么位置,请首先使用字典对元素进行分组:

grouped = {}
for key, string in mylist:
grouped.setdefault(key, []).append(string)
mynewlist = [(key, ', '.join([s for num, s in group])) for key, group in grouped.items()]

关于 python 2.7 : efficiently reformat list of tuples,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35398671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com