[英]python join list of list of lists using key
我有這個列表結構:
lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]]]
'lst'可以包含任意數量的子列表(len(lst)可以大於2)
作為我想要的輸出:
output = [['a',100,50],['b',200,250],['c',0,75],['d',325,0]]
這是另一個例子:
lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]], [['a', 22], ['b', 10]]]
output = [['a', 100, 50, 22],['b', 200, 250, 10], ['c', 0, 75, 0], ['d', 325, 0, 0]]
你會怎么做?
您可以使用defaultdict
:
from collections import defaultdict
import itertools
d = defaultdict(list)
lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]]]
for a, b in itertools.chain.from_iterable(lst):
d[a].append(b)
new_lst = sorted([list(itertools.chain.from_iterable([[a], [0 for i in range(len(max(d.items(), key=lambda x:len(x[-1])))-len(b))]+b])) for a, b in d.items()])
輸出:
[['a', 100, 50], ['b', 200, 250], ['c', 0, 75], ['d', 0, 325]]
如果我們有一個lst
使用的所有字母鍵的列表,這個任務會更簡單,但是提取它們很容易。
我的策略是將子列表轉換為字典。 這樣可以輕松高效地獲取與每個鍵相關的值。 dict.get
方法允許我們為缺失的鍵提供默認值。
lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]]]
# Convert outer sublists to dictionaries
dicts = [*map(dict, lst)]
# Get all the keys
keys = set()
for d in dicts:
keys.update(d.keys())
# Get data for each key from each dict, using 0 if a key is missing
final = [[k] + [d.get(k, 0) for d in dicts] for k in sorted(keys)]
print(final)
產量
[['a', 100, 50], ['b', 200, 250], ['c', 0, 75], ['d', 325, 0]]
如果我們使用
lst = [[['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]], [['a', 22], ['b', 10]]]
那么輸出就是
[['a', 100, 50, 22], ['b', 200, 250, 10], ['c', 0, 75, 0], ['d', 325, 0, 0]]
如果你想在Python 2上運行它,你需要對將外部子列表轉換為字典的代碼進行微小的更改。 將其更改為
dicts = list(map(dict, lst))
這將在Python 2和3上正常工作。如果你只需要在Python 2上運行它,你就可以做到
dicts = map(dict, lst)
因為Python 2中的map
返回一個列表,而不是迭代器。
使用itertools.chain.from_iterable()
, itertools.groupby()
函數和內置的next()
函數:
import itertools
lst = [ [['a', 100],['b', 200],['d', 325]],[['a', 50],['b', 250],['c', 75]], [['a', 22], ['b', 10]] ]
lst_len = len(lst)
sub_keys = [{k[0] for k in _} for _ in lst]
result = [[k] + [next(g)[1] if k in sub_keys[i] else 0 for i in range(lst_len)]
for k,g in itertools.groupby(sorted(itertools.chain.from_iterable(lst), key=lambda x:x[0]), key=lambda x: x[0])]
print(result)
輸出:
[['a', 100, 50, 22], ['b', 200, 250, 10], ['c', 0, 75, 0], ['d', 325, 0, 0]]
這是我的“長手”方法,我只需要弄清楚發生了什么:
lst = [[['a', 100],['b', 200],['d', 325]],
[['a', 50],['b', 250],['c', 75]],
[['a', 22], ['b', 10]],
[['c', 110],['f', 200],['g', 425]],
[['a', 50],['f', 250],['h', 75]],
[['a', 32], ['b', 10]], ]
nlist = []
store={}
for n,j in enumerate(lst):
for i in j :
if i[0] in store :
store[i[0]].append(i[1])
else :
store[i[0]] = nlist + [i[1]]
nlist += [0]
for k,v in store.items() :
if len(v) < n+1 :
store[k] = v + [0]
print(store)
result=[]
for k,v in store.items():
result += [[k] + v]
print(sorted(result))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.