Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从列表';什么东西?_Python_List_Dictionary - Fatal编程技术网

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')]]}}}