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()]