Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Tuples - Fatal编程技术网

Python 元组列表,按第一个元素分组并添加第二个元素

Python 元组列表,按第一个元素分组并添加第二个元素,python,list,tuples,Python,List,Tuples,假设我有以下元组列表: tuples = [ [ ('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00') ], [ ('2017-04-12', '47294

假设我有以下元组列表:

tuples = [
             [ 
                 ('2017-04-11', '2000000.00'), 
                 ('2017-04-12', '1000000.00'), 
                 ('2017-04-13', '3000000.00')
             ],
             [
                 ('2017-04-12', '472943.00'), 
                 ('2017-04-13', '1000000.00')
             ]
             # ...
         ]
我如何根据第一个元素(日期)对它们进行分组并添加另一个元素

例如,我想要这样的东西:

tuples = [('2017-04-11', '2000000.00'), ('2017-04-12', '1472943.00'), ('2017-04-13', '4000000.00')],

使用
itertools.chain.from_iterable
itertools.groupby
sum
函数的解决方案:

import itertools, operator

tuples = [
         [('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')],
         [('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')]
         ]

result = [(k, "%.2f" % sum(float(t[1]) for t in g)) 
          for k,g in itertools.groupby(sorted(itertools.chain.from_iterable(tuples)), operator.itemgetter(0))]

print(result)
输出:

[('2017-04-11', '2000000.00'), ('2017-04-12', '1472943.00'), ('2017-04-13', '4000000.00')]

我的方法是将嵌套列表转换为平面列表并进行迭代:

t = [
         [('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')],
         [('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')]
         ]
a={}

for i,j in sum(t,[]):
    a[i]=a[i]+float(j) if i in a else float(j)

print(a)
输出:

{'2017-04-11': 2000000.0, '2017-04-13': 4000000.0, '2017-04-12': 1472943.0}

如果需要列表,可以使用
[(k,v)表示a.items()中的k,v]。

展平列表,然后使用defaultdict:

from collections import defaultdict

flattened_tuples = [item for sublist in tuples for item in sublist]

result = defaultdict(float)
for date, value in flattened_tuples:
    result[date] += float(value)
print(result)
返回
{'2017-04-11':2000000.0,'2017-04-12':1472943.0,'2017-04-13':4000000.0}

首先,从元组列表中展开元组列表,然后使用


因此,您已经发布了您的输入和预期结果。但是你自己解决问题的方法是什么?请发布您的代码,并告诉我们您在哪里被卡住了。看到预期的输出无法理解清楚。但是:将组标识作为键,并用它创建一个字典<代码>{“组标识”,[上面提到的列表]}。使用python以这种格式创建数据。这就是你想要的吗?我问了一个问题,因为我尝试了很多解决方案,但都没能成功。我尝试了map,itertools.izip_,但没有任何运气@mpf82
import itertools 
import operator

lists = [
         [('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')],
         [('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')]
         ]

# Step 1: Flat a list of tuples out of a list of lists of tuples
list_tuples = [t for sublist in lists for t in sublist]
'''
[('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00'), ('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')]
'''

# Step 2: Groupby
results = list()

for key, group in itertools.groupby(sorted(list_tuples), operator.itemgetter(0)):
    s = sum(float(t[1]) for t in group)
    results.append((key, s))

print(results)
#[('2017-04-11', 2000000.0), ('2017-04-12', 1472943.0), ('2017-04-13', 4000000.0)]