Python 在列表中组合列表元素

Python 在列表中组合列表元素,python,list,Python,List,我是一个新的python用户,我需要关于在特定条件下组合列表元素的帮助。 我有这样一份清单: x = [['a', 10, 20], ['b', 10, 20], ['a', 20, 100]] 我想通过总结其他元素,将列表中以相同字母开头的元素组合在一起。例如,我想获得x的列表: x = [['a', 30, 120], ['b', 10, 20]] 如何实现这一点?使用以下各项的一行程序: 一个简单的解决方案: In [23]: lis=[['a', 10, 20], ['b', 10,

我是一个新的python用户,我需要关于在特定条件下组合列表元素的帮助。 我有这样一份清单:

x = [['a', 10, 20], ['b', 10, 20], ['a', 20, 100]]
我想通过总结其他元素,将列表中以相同字母开头的元素组合在一起。例如,我想获得
x
的列表:

x = [['a', 30, 120], ['b', 10, 20]]
如何实现这一点?

使用以下各项的一行程序:

一个简单的解决方案:

In [23]: lis=[['a', 10, 20], ['b', 10, 20], ['a', 20, 100]]

In [24]: ans=[]

In [25]: lis.sort(key=itemgetter(0))   #sort the list according to the first elem

In [26]: lis
Out[26]: [['a', 10, 20], ['a', 20, 100], ['b', 10, 20]]

In [27]: for x in lis:
    if ans:
        if x[0]==ans[-1][0]:  #if the value of the first elem of last element in ans is same as x[0]
            ans[-1][1]+=x[1]
            ans[-1][2]+=x[2]
        else:         
            ans.append(x)
    else:ans.append(x)
   ....:     

In [28]: ans
Out[28]: [['a', 30, 120], ['b', 10, 20]]
不使用
defaultdict()
对列表进行排序:

[69]中的
:dic=defaultdict(列表)
In[70]:对于lis中的x:
dic[x[0]]。追加(x[1:])
....:     
在[71]中:dic
Out[71]:defaultdict(,{'a':[10,20],[20,100],'b':[10,20]})
在[72]中:[[k]+在dic.items()中k,i的映射(sum,zip(*i))]
出[72]:[a',30,120],[b',10,20]]

另一种使用
dict
map
的方法:

>>> x = [['a', 10, 20], ['b', 10, 20], ['a', 20, 100]]
>>> d = {}
>>> from operator import add
>>> for k, v1, v2 in x:
    d[k] = map(add, d.get(k, [0, 0]), [v1, v2])

>>> d
{'a': [30, 120], 'b': [10, 20]}
我将使用一个包含超过百万个元素的巨大数据的答案代码。我想这样减少列表元素

在这种情况下,您可能不希望在迭代数据时对数据进行排序或构建完整副本

下面的解决方案两者都不适用。它还可以处理任意长度的子列表(只要所有长度相同):

或者

import collections, operator

x = [['a', 10, 20], ['b', 10, 20], ['a', 20, 100]]

d = collections.defaultdict(lambda:[0] * (len(x[0]) - 1))
for el in x:
  d[el[0]] = map(operator.add, d[el[0]], el[1:])
result = [[k] + v for k,v in d.items()]
print(result)

这与第一个版本的工作原理完全相同,但使用了
defaultdict
和显式迭代。

你的意思是“x=['a',30,120],'b',10,20]]@user1833746-我什么都做不了,仍然在搜索我应该做什么。@gg.kaspersky-不,所有元素实际上都是浮点型的。@user1907576,实际上我在问它是否是浮点型的(以前定义的变量)或“a”(字符).@gg.kaspersky,对不起,我误解了。这是一个字符。哦,非常感谢。但问题是,我不仅仅是问上面的例子。我要用答案代码来表示包含超过百万个元素的大量数据。我希望以这种方式减少列表元素。所以,这是我的错,我无法准确定义问题。非常感谢再次感谢您的关注。@user1907576那么这些方法有什么问题吗?没关系。我错误地解释了这些方法。我现在得到了更好的结果。我正在对我的部分数据应用简单的方法。再次感谢您。它工作得非常好。您无法想象您有多大帮助。@user1907576很高兴这有帮助。谢谢您的关注t、 谢谢你,我也要试试。
>>> x = [['a', 10, 20], ['b', 10, 20], ['a', 20, 100]]
>>> d = {}
>>> from operator import add
>>> for k, v1, v2 in x:
    d[k] = map(add, d.get(k, [0, 0]), [v1, v2])

>>> d
{'a': [30, 120], 'b': [10, 20]}
def add(d, l):
   k = l[0]            # extract the key
   p = d.get(k, None)  # see if we already have a partial sum for this key
   if p:
      d[k] = [x+y for x,y in zip(p, l[1:])] # add to the previous sum
   else:
      d[k] = l[1:]     # create a new sum
   return d

x = [['a', 10, 20], ['b', 10, 20], ['a', 20, 100]]
result = [[k] + v for k,v in reduce(add, x, {}).items()]
print(result)
import collections, operator

x = [['a', 10, 20], ['b', 10, 20], ['a', 20, 100]]

d = collections.defaultdict(lambda:[0] * (len(x[0]) - 1))
for el in x:
  d[el[0]] = map(operator.add, d[el[0]], el[1:])
result = [[k] + v for k,v in d.items()]
print(result)