列表和添加第二个元素
问题描述:
比方说,我有元组的名单如下列表:列表和添加第二个元素
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) for k,v in a.items()])
答
压扁列表,然后利用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}
答
首先,扁一个元组出来的元组的列表的列表的列表,然后用itertools.groupby
,
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)]
所以,你发布你的输入和你预期的结果。但是,你自己在解决问题的方法在哪里?请发布您的代码并告诉我们您卡在哪里。 –
通过看到预期的产出不明白。但是: 将群组标识设为密钥并创建一个字典。 '{“group-identity”,[your-list-mentioned-above]}'。使用python以这种格式创建数据。这是你在找什么? – Haranadh
我已经提出了一个问题,因为我尝试了很多解决方案,无法实现。我尝试了map,itertools.izip_longest没有任何运气@ mpf82 –