Python—元组列表,在本例中具有相同第一个值的元组之和?
假设我有这个案子。如果它在第一个位置以相同的名字开始,我想把第二个和第二个加在一起,第三个和第三个加在一起 预期结果:Python—元组列表,在本例中具有相同第一个值的元组之和?,python,list,dictionary,tuples,Python,List,Dictionary,Tuples,假设我有这个案子。如果它在第一个位置以相同的名字开始,我想把第二个和第二个加在一起,第三个和第三个加在一起 预期结果: li=[('name1', 5, 10), ('name2', 3, 2), ('name1', 6, 3)] 有人知道我如何在Python中做到这一点吗?给定: [('name1', 11, 13), ('name2', 3, 2)] 您可以首先使用dict累积类似的标记: LoT=[('name1', 5, 10), ('name2', 3, 2), ('name1',
li=[('name1', 5, 10), ('name2', 3, 2), ('name1', 6, 3)]
有人知道我如何在Python中做到这一点吗?给定:
[('name1', 11, 13), ('name2', 3, 2)]
您可以首先使用dict累积类似的标记:
LoT=[('name1', 5, 10), ('name2', 3, 2), ('name1', 6, 3)]
然后使用这些标记的总和创建一个新列表:
di={}
for t in LoT:
di.setdefault(t[0], []).append(t[1:])
>>> di
{'name1': [(5, 10), (6, 3)], 'name2': [(3, 2)]}
或者,只需保持一个连续的总数:
>>> [(k,)+tuple(map(sum, zip(*li))) for k,li in di.items()]
[('name1', 11, 13), ('name2', 3, 2)]
# the interesting thing here is the zip(*li) which rotates the list of tuples
# zip(*[(5, 10), (6, 3)]) => [(5, 6), (10, 3)]
然后将正在运行的总目录转换为列表:
di={}
for t in LoT:
try:
di[t[0]]=tuple(map(sum, zip(di[t[0]], t[1:])))
except KeyError:
di[t[0]]=t[1:]
无论元组的长度如何,这些解决方案都有效。names=['name1',5,10',name2',3,2',name1',6,3]
迭代原始列表的所有成员以执行逻辑
新名称=dict
对于n,第一个和第二个名称:
如果n不是以新名称命名:
新名称[n]=第一、第二
其他:
新名称[n]=第一个+新名称[n][0],第二个+新名称[n][1]
获取元组列表
新_名称2=[k,*v代表k,新_名称中的v.items]
打印新名称2
输出:
li=[('name1', 5, 10), ('name2', 3, 2), ('name1', 6, 3)]
# Get length of structure
li_len = len(li)
# Create empty collection
outdict = {}
# Iterate over all elements
for i in range(li_len):
tmpname = li[i][0] # Temp name variable
tmpvalues = li[i][1:] # Temp values variable
# If not temp name in dictionary keys
if not tmpname in outdict:
# Create entry with values as first values
outdict[tmpname] = list(tmpvalues)
else:
# Otherwise, iterate values and update entry by position
for j in range(len(tmpvalues)):
outdict[tmpname][j] += tmpvalues[j]
# Reformat for output
result = [tuple([k] + v) for k, v in outdict.items()]
# Print result
print(result)
['name1',11,13,'name2',3,2]
您应该将元组定义为类。但是如果数据是作为一组元组给出的。。。然后定义一个函数addTuple
最初元组的值是不能更改的,但如果您想按自己的方式执行,则可以这样做 李=['name1',5,10],'name2',3,2],'name1',6,3]] 新_li=[] 对于li中的tup: 名称=[tup[0]表示新文档中的tup] 如果名称中的tup[0]: 索引=名称。索引[0] 新的_li[index][1]+=tup[1] 新(指数)][2]+=tup[2] 其他: 新附录 [name1',11,13],[name2',3,2]] 让它成为元组 new_li=[tuplel表示新_li中的l] ['name1',11,13,'name2',3,2]
还有一个答案,但有一些内在的灵活性:
def addTuple(t1, t2):
(ta,va1,va2) = t1
try: (ta,va1,va2) = t1
except:
# FIXME: default to None, value 0
(ta,va1, va2) = (None, 0, 0)
try:
# FIXME: default to None, value 0
(tb,vb1,vb2) = t2
except:
# FIXME: default to None, value 0
(tb,vb1, vb2) = (None, 0, 0)
return (ta, va1+vb1, va2+vb2)
print([addTuple(arr[0],arr[2]), addTuple(arr[1],0)])
[('name1', 1
输出:
li=[('name1', 5, 10), ('name2', 3, 2), ('name1', 6, 3)]
# Get length of structure
li_len = len(li)
# Create empty collection
outdict = {}
# Iterate over all elements
for i in range(li_len):
tmpname = li[i][0] # Temp name variable
tmpvalues = li[i][1:] # Temp values variable
# If not temp name in dictionary keys
if not tmpname in outdict:
# Create entry with values as first values
outdict[tmpname] = list(tmpvalues)
else:
# Otherwise, iterate values and update entry by position
for j in range(len(tmpvalues)):
outdict[tmpname][j] += tmpvalues[j]
# Reformat for output
result = [tuple([k] + v) for k, v in outdict.items()]
# Print result
print(result)
下面是一个使用类定义的方法:
[('name1', 11, 13), ('name2', 3, 2)]
更简单的解决方案:
class mytuple(object):
def __init__(self, tx, val1, val2):
self.tx = tx
self.val1 = val1
self.val2 = val2
def __add__(self, t2):
if self.tx != t2.tx :
print("WARNING: BAD TUPLE, ignoring", self.tx, t2.tx)
return mytuple(self.tx,
self.val1 + t2.val1,
self.val2 + t2.val2)
def __str__(self):
self.__repr()
def __repr__(self):
tstr = ', '.join([self.tx,
'%d'%self.val1,
'%d'%self.val2])
return('(%s)'%tstr)
arr = [ mytuple('name1', 5, 10),
mytuple('name2', 3, 2),
mytuple('name1', 6, 3)]
print([arr[0] + arr[2], arr[1]])
[(name1, 11, 13), (name2, 3, 2)]
如果OP的数据集合中每个元素有两个以上的值,会发生什么情况?他们是否每次都要更新和调整算法?编辑以处理长度超过2的元组,但这真的不是问题…哇,这是我在这里问的第一个问题,我对在这么短的时间内已经有这么多解决方案印象深刻。非常感谢大家,我会研究每个答案来提高我的编程技能。多亏了你们,我终于解决了我想要的问题。
i = [('name1', 5, 10), ('name2', 3, 2), ('name1', 6, 3)]
d = {}
for name, fv, sv in i:
if name not in d:
d[name] = [name, fv, sv]
else:
d[name][1] += fv
d[name][2] += sv
[tuple(v) for v in d.values()]