Python 如何从列表';什么东西?
我有一个列表,如:Python 如何从列表';什么东西?,python,list,dictionary,Python,List,Dictionary,我有一个列表,如: a = [ ['A', 'America', 'LA', '1123', '2014-05-01', [('A', '211'), ('AD', '398')]], ['D', 'America', 'LA', '1135', '2014-05-01', [('A', '211'), ('AD', '398')]], ['I', 'America', 'SF', '1145', '2014-05-01', [('A', '211'), ('AD'
a = [
['A', 'America', 'LA', '1123', '2014-05-01', [('A', '211'), ('AD', '398')]],
['D', 'America', 'LA', '1135', '2014-05-01', [('A', '211'), ('AD', '398')]],
['I', 'America', 'SF', '1145', '2014-05-01', [('A', '211'), ('AD', '398')]],
['A', 'England', 'LND', '3564', '2014-05-01', [('A', '211'), ('AD', '398')]],
['D', 'Dubai', 'DUB', '9990', '2014-05-01', [('A', '211'), ('AD', '398')]],
['D', 'Dubai', 'DUX', '9670', '2014-05-01', [('A', '211'), ('AD', '398')]],
['I', 'Dubai', 'DUB', '9800', '2014-05-01', [('A', '211'), ('AD', '398')]],
]
我想要一个嵌套的Dict,比如:
d = {
'America': {
'LA': {
'1123' : ['A', '2014-05-01', [('A', '211'), ('AD', '398')]],
'1135': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]
},
'SF': {
'1145': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]]
}
},
'England': {
'LND': {
'3564': ['A', '2014-05-01', [('A', '211'), ('AD', '398')]]
}
},
'Dubai': {
'DUB': {
'9990': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]],
'9800': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]]
},
'DUX': {
'9670': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]
}
}
}
我已经试过了,但还是做不到,请检查我的代码并帮助我
pd = defaultdict(dict)
for row in a:
country = defaultdict(dict)
for c in a:
dest = defaultdict(list)
for d in a:
if c[2] == d[2]:
dest[d[3]].append([d[1], d[0],d[4],d[5],d[6], d[7]])
else:
continue
country[c[2]] = dest
pd[row[1]] = country
请尝试以下操作:
pd = dict()
for (k4, k1, k2, k3, k5, k6) in a:
pd.setdefault(k1, dict())
pd[k1].setdefault(k2, dict())
pd[k1][k2].setdefault(k3, dict())
pd[k1][k2][k3] = [k4, k5, k6]
输出为:
{'America': {'LA': {'1123': ['A', '2014-05-01', [('A', '211'), ('AD', '398')]],
'1135': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]},
'SF': {'1145': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]]}},
'Dubai': {'DUB': {'9800': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]],
'9990': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]},
'DUX': {'9670': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]}},
'England': {'LND': {'3564': ['A',
'2014-05-01',
[('A', '211'), ('AD', '398')]]}}}
输出
{'America': {'LA': {'1123': ['A',
'2014-05-01',
[('A', '211'), ('AD', '398')]],
'1135': ['D',
'2014-05-01',
[('A', '211'), ('AD', '398')]]},
'SF': {'1145': ['I',
'2014-05-01',
[('A', '211'), ('AD', '398')]]}},
'Dubai': {'DUB': {'9800': ['I',
'2014-05-01',
[('A', '211'), ('AD', '398')]],
'9990': ['D',
'2014-05-01',
[('A', '211'), ('AD', '398')]]},
'DUX': {'9670': ['D',
'2014-05-01',
[('A', '211'), ('AD', '398')]]}},
'England': {'LND': {'3564': ['A',
'2014-05-01',
[('A', '211'), ('AD', '398')]]}}}
您的代码提供:
Traceback (most recent call last):
File "<pyshell#12>", line 7, in <module>
dest[d[3]].append([d[1], d[0],d[4],d[5],d[6], d[7]])
IndexError: list index out of range
因此,d[6]
和d[7]
不存在
最基本的解决方案是:
dest[d[3]].append([d[1], d[0], d[4], d[5]])
使用嵌套的
defaultdicts
,然后可以在for循环中使用一个简单的赋值语句覆盖a
from collections import defaultdict
out = defaultdict(lambda : defaultdict(lambda :defaultdict(dict)))
for item in a:
out[item[1]][item[2]][item[3]] = [item[0]] + item[4:]
print out == d # Comparing it to the fixed expected output.
print out
输出:
True
defaultdict(<function <lambda> at 0xadcd70>,
{'Dubai': defaultdict(<function <lambda> at 0x106a398>,
{'DUX': defaultdict(<type 'dict'>,
{'9670': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]}),
'DUB': defaultdict(<type 'dict'>,
{'9990': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]],
'9800': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]]})}),
'America': defaultdict(<function <lambda> at 0x1066c08>,
{'SF': defaultdict(<type 'dict'>,
{'1145': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]]}),
'LA': defaultdict(<type 'dict'>,
{'1123': ['A', '2014-05-01', [('A', '211'), ('AD', '398')]],
'1135': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]})}),
'England': defaultdict(<function <lambda> at 0x106a320>,
{'LND': defaultdict(<type 'dict'>,
{'3564': ['A', '2014-05-01', [('A', '211'), ('AD', '398')]]})})})
真让人困惑
from itertools import groupby
f1 = lambda x: x[1]
f2 = lambda x: x[2]
f3 = lambda x: x[3]
b = sorted(a, key=lambda x: (x[3], x[2], x[1]))
d = {}
for i in groupby(b, f1):
d[i[0]] = {}
for j in groupby(i[1], f2):
d[i[0]][j[0]] = {}
for k in groupby(j[1], f3):
d[i[0]][j[0]][k[0]] = []
for l in k[1]:
d[i[0]][j[0]][k[0]].append(list(l)[0])
d[i[0]][j[0]][k[0]].append(list(l)[4])
d[i[0]][j[0]][k[0]].append(list(l)[5])
输出:
>>> d
{'America': {'LA': {'1123': ['A', '2014-05-01', [('A', '211'), ('AD', '398')]],
'1135': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]},
'SF': {'1145': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]]}},
'Dubai': {'DUB': {'9800': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]],
'9990': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]},
'DUX': {'9670': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]}},
'England': {'LND': {'3564': ['A',
'2014-05-01',
[('A', '211'), ('AD', '398')]]}}}
我已经修复了我们的预期输出('DUB'中的9670'是错误的),并且使它成为一个有效的Python dict。
from collections import defaultdict
from operator import itemgetter
out = defaultdict(lambda : defaultdict(lambda :defaultdict(dict)))
indices = (1, 2, 3)
rest = [i for i in range(len(a[0])) if i not in indices]
key_getter = itemgetter(*indices)
value_getter = itemgetter(*rest)
for item in a:
keys = key_getter(item)
dct = reduce(lambda x, y: x[y], keys[:-1], out) #fetch the innermost dict
dct[keys[-1]] = list(value_getter(item))
from itertools import groupby
f1 = lambda x: x[1]
f2 = lambda x: x[2]
f3 = lambda x: x[3]
b = sorted(a, key=lambda x: (x[3], x[2], x[1]))
d = {}
for i in groupby(b, f1):
d[i[0]] = {}
for j in groupby(i[1], f2):
d[i[0]][j[0]] = {}
for k in groupby(j[1], f3):
d[i[0]][j[0]][k[0]] = []
for l in k[1]:
d[i[0]][j[0]][k[0]].append(list(l)[0])
d[i[0]][j[0]][k[0]].append(list(l)[4])
d[i[0]][j[0]][k[0]].append(list(l)[5])
>>> d
{'America': {'LA': {'1123': ['A', '2014-05-01', [('A', '211'), ('AD', '398')]],
'1135': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]},
'SF': {'1145': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]]}},
'Dubai': {'DUB': {'9800': ['I', '2014-05-01', [('A', '211'), ('AD', '398')]],
'9990': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]},
'DUX': {'9670': ['D', '2014-05-01', [('A', '211'), ('AD', '398')]]}},
'England': {'LND': {'3564': ['A',
'2014-05-01',
[('A', '211'), ('AD', '398')]]}}}