我有一个嵌套列表,其中包含产品名称,产品ID和产品数据(另一个列表)。我想创建一个具有唯一名称和产品ID的词典列表,并加入与名称和ID变量相关的数据列表。
我的数据如下:
print(x)
[(14, 'netflix', [1, 2, 3, 4, 5, 6]), (14, 'netflix', [7, 8, 9, 10]),(15,'tv',
[1, 2, 3, 4, 5]), (15, 'tv', [7, 8, 9]), (16, 'radio', [1, 2, 3, 4]),
(16, 'radio', [1, 2, 3, 4])
我想将数据转换为:
x = [{'product_id':x[0], 'product': row[1], 'values':row[2]} for row in x]
#or for this example
x = [{'product_id':14, 'product':'netflix', 'values':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]},
{'product_id':15, 'product': 'tv', 'values':[1, 2, 3, 4, 5, 6, 7, 8, 9]},
{'product_id':16, 'product': 'radio', 'values':[1, 2, 3, 4, 1, 2, 3, 4]}]
我知道我可以使用以下方法遍历嵌套列表:
for inner_l in x:
for item in x:
print(item)
但是我不确定如何操作这些列表以创建所需的输出
答案 0 :(得分:7)
使用简单的迭代。
例如:
data = [(14, 'netflix', [1, 2, 3, 4, 5, 6]), (14, 'netflix', [7, 8, 9, 10]),(15,'tv',[1, 2, 3, 4, 5]), (15, 'tv', [7, 8, 9]), (16, 'radio', [1, 2, 3, 4]),(16, 'radio', [1, 2, 3, 4]) ]
keys = ['product_id', 'product', 'values']
result = {}
for product_id, product, values in data:
if product_id not in result:
result[product_id] = dict(zip(keys, (product_id, product, values)))
else:
result[product_id]["values"].extend(values)
print(list(result.values()))
输出:
[{'product': 'netflix',
'product_id': 14,
'values': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]},
{'product': 'tv', 'product_id': 15, 'values': [1, 2, 3, 4, 5, 7, 8, 9]},
{'product': 'radio', 'product_id': 16, 'values': [1, 2, 3, 4, 1, 2, 3, 4]}]
答案 1 :(得分:2)
一种方法是使用itertools.groupby
按第一项将内部元组分组,即product_id
(如果未排序则可能需要排序,并将其作为字典附加到列表中将两个列表合并到最后一个位置:
from itertools import groupby
from operator import itemgetter as ig
keys = ['product_id', 'product', 'values']
out = []
for _, ((*a,b), (*_,c)) in groupby(sorted(l, key=ig(0)), key=ig(0)):
out.append(dict(zip(keys, a + [b+c])))
print(out)
[{'product': 'netflix', 'product_id': 14, 'values': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]},
{'product': 'tv', 'product_id': 15, 'values': [1, 2, 3, 4, 5, 7, 8, 9]},
{'product': 'radio', 'product_id': 16, 'values': [1, 2, 3, 4, 1, 2, 3, 4]}]
答案 2 :(得分:2)
由于您标记了pandas
,所以将pd.DataFrame
构造函数与列命名一起使用,然后将groupby
与sum
一起使用,并将to_dict
与{{1} }:
orient='records'
输出:
import pandas as pd
x = [(14, 'netflix', [1, 2, 3, 4, 5, 6]), (14, 'netflix', [7, 8, 9, 10]),(15,'tv',
[1, 2, 3, 4, 5]), (15, 'tv', [7, 8, 9]), (16, 'radio', [1, 2, 3, 4]),
(16, 'radio', [1, 2, 3, 4])]
df = pd.DataFrame(x, columns=['product_id','product', 'values'])
df.groupby(['product_id','product'], as_index=False)[['values']]\
.sum()\
.to_dict(orient='records')
答案 3 :(得分:1)
一个解决我的问题的简单方法,涉及使用.setdefalut()
设置字典键并连接字符串:
new_dict = dict()
for i in x:
new_dict.setdefault(i[0], '')
new_dict[x[0]] += ',' + i[1][1:-1]
for prod in new_dict:
new_dict[prod] = new_dict[prod][1:]
答案 4 :(得分:0)
您可以这样使用defaultdict
,其中x
是输入数据:
from collections import defaultdict
res = defaultdict(dict)
for h in x:
k = h[1]
res[k]['id'] = h[0]
res[k]['product'] = h[1]
if 'values' in res[k]:
res[k]['values'] += h[2]
else:
res[k]['values'] = h[2]
然后您可以从res
中提取:
print(dict(res))
#=> {'netflix': {'id': 14, 'product': 'netflix', 'values': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}, 'tv': {'id': 15, 'product': 'tv', 'values': [1, 2, 3, 4, 5, 7, 8, 9]}, 'radio': {'id': 16, 'product': 'radio', 'values': [1, 2, 3, 4, 1, 2, 3, 4]}}
print(list(res.values()))
#=> [{'id': 14, 'product': 'netflix', 'values': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}, {'id': 15, 'product': 'tv', 'values': [1, 2, 3, 4, 5, 7, 8, 9]}, {'id': 16, 'product': 'radio', 'values': [1, 2, 3, 4, 1, 2, 3, 4]}]
defaultdict
:
res = defaultdict(lambda: defaultdict(dict, {'product': None, 'id': None, 'values': []}))
for h in x:
k = h[1]
res[k]['id'] = h[0]
res[k]['product'] = h[1]
res[k]['values'] += h[2]
这将导致:
print(list(res.values()))
#=> [defaultdict(<class 'dict'>, {'product': 'netflix', 'id': 14, 'values': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 8, 9, 10]}), defaultdict(<class 'dict'>, {'product': 'tv', 'id': 15, 'values': [1, 2, 3, 4, 5, 7, 8, 9, 7, 8, 9]}), defaultdict(<class 'dict'>, {'product': 'radio', 'id': 16, 'values': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]})]
print([ dict(val) for val in res.values()])
#=> [{'product': 'netflix', 'id': 14, 'values': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 8, 9, 10]}, {'product': 'tv', 'id': 15, 'values': [1, 2, 3, 4, 5, 7, 8, 9, 7, 8, 9]}, {'product': 'radio', 'id': 16, 'values': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]}]