嵌套列表操作

时间:2019-07-19 13:25:05

标签: python python-3.x pandas list numpy

我有一个嵌套列表,其中包含产品名称,产品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)

但是我不确定如何操作这些列表以创建所需的输出

5 个答案:

答案 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构造函数与列命名一起使用,然后将groupbysum一起使用,并将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]}]
相关问题