Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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中从列表创建字典-dict键会忽略列表中相同的项_Python_Python 3.x_List_Dictionary - Fatal编程技术网

在Python中从列表创建字典-dict键会忽略列表中相同的项

在Python中从列表创建字典-dict键会忽略列表中相同的项,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,从列表创建词典时,词典的键忽略列表中相同的项,并将最后一项存储为键 例如: lst1 = [["Apple",20.00,"Swiss"], ["Banana",5.00,"Brazil"], ["Strawberry",25.00,"Swiss"], ["Pear",12.00,"Greece"], ["Mango",3.00,"Peru"], ["Avacado",7.00,"Peru"]] my_dict = {val[2]:val[:2] for

从列表创建词典时,词典的键忽略列表中相同的项,并将最后一项存储为键

例如:

lst1 = [["Apple",20.00,"Swiss"],
    ["Banana",5.00,"Brazil"],
    ["Strawberry",25.00,"Swiss"],
    ["Pear",12.00,"Greece"],
    ["Mango",3.00,"Peru"],
    ["Avacado",7.00,"Peru"]]

my_dict = {val[2]:val[:2] for val in lst1}

print (my_dict)
打印这个

{'Swiss': ['Strawberry', 25.0], 'Brazil': ['Banana', 5.0], 'Greece': ['Pear', 12.0], 'Peru': ['Avacado', 7.0]}
据我所知,这是因为键不能完全相同,那么为什么不将相同键的值分组到一个列表中呢。像这样

{
    'Swiss': [["Apple",20.00],['Strawberry', 25.0]],
    'Brazil': ['Banana', 5.0],
    'Greece': ['Pear', 12.0],
    'Peru': [["Mango",3.00],['Avacado', 7.0]]
}
在纯Python中有什么方法可以做到这一点吗?

这些“累积”问题不能简单地用列表理解来解决(或者用损害可读性的丑陋的副作用来解决)

您需要
collections.defaultdict(list)
创建夫妇列表作为值,国家/地区作为键:

lst1 = [["Apple",20.00,"Swiss"],
    ["Banana",5.00,"Brazil"],
    ["Strawberry",25.00,"Swiss"],
    ["Pear",12.00,"Greece"],
    ["Mango",3.00,"Peru"],
    ["Avacado",7.00,"Peru"]]

result = collections.defaultdict(list)

for fruit,price,country in lst1:
    result[country].append([fruit,price])

print(dict(result))  # convert to dict for a cleaner representation when printing
结果:

{'Swiss': [['Apple', 20.0], ['Strawberry', 25.0]], 'Brazil': [['Banana', 5.0]], 'Greece': [['Pear', 12.0]], 'Peru': [['Mango', 3.0], ['Avacado', 7.0]]}

据我所知,这不能在
理解
中完成,但你可以使用
lst1
中的每个列表的第二个元素在
字典
中设置一个
,然后你可以立即
将该片段添加到它上面(就像你所做的那样)。
setdefault
的整洁之处在于,如果
键已经存在,我们可以将其追加到
键上,或者创建该
键,如果它不存在,则追加。这两个操作都是在没有
if语句的情况下执行的

d = {}
for l in lst1:
    d.setdefault(l[2], []).append(l[:2])
给予:

{'Brazil': [['Banana', 5.0]],
 'Greece': [['Pear', 12.0]],
 'Swiss': [['Apple', 20.0], ['Strawberry', 25.0]],
 'Peru': [['Mango', 3.0], ['Avacado', 7.0]]}

您不能使用字典理解,因为您不知道前面的键已经存在

你必须使用一个直上循环。将所有值添加到列表中,而不仅仅是重复的值。不要在这里混搭结构,那只会在以后造成更多的麻烦。如果你没有,你将不得不检测你是否有一个嵌套列表或一个单一水果和价格的平面列表

您可以使用常规词典:

my_dict = {}
for fruit, price, origin in lst1:
    my_dict.setdefault(origin, []).append([fruit, price])
如果缺少键(第一个参数),则调用
dict.setdefault()
会向字典中添加一个空列表。然后,它返回给定键的值(可能是现有列表或新的空列表)。然后该行调用
list.append()
,添加水果和价格

或者,您可以在缺少密钥时使用创建空列表:

from collections import defaultdict

my_dict = defaultdict(list)
for fruit, price, origin in lst1:
    my_dict[origin].append([fruit, price])
使用defaultdict的代码更加简洁,但缺点是该对象现在将继续为缺少的键生成空列表,即使您可能因为代码中的错误而不打算这样做

两者都能产生预期的结果:

>>> my_dict = {}
>>> for fruit, price, origin in lst1:
...     my_dict.setdefault(origin, []).append([fruit, price])
...
>>> my_dict
{'Swiss': [['Apple', 20.0], ['Strawberry', 25.0]], 'Brazil': [['Banana', 5.0]], 'Greece': [['Pear', 12.0]], 'Peru': [['Mango', 3.0], ['Avacado', 7.0]]}
>>> from collections import defaultdict
>>> my_dict = defaultdict(list)
>>> for fruit, price, origin in lst1:
...     my_dict[origin].append([fruit, price])
...
>>> my_dict
defaultdict(<class 'list'>, {'Swiss': [['Apple', 20.0], ['Strawberry', 25.0]], 'Brazil': [['Banana', 5.0]], 'Greece': [['Pear', 12.0]], 'Peru': [['Mango', 3.0], ['Avacado', 7.0]]})
>>my_dict={}
>>>对于水果,价格、产地在lst1:
...     my_dict.setdefault(origin,[]).append([水果,价格])
...
>>>我的字典
{'Swiss':[['Apple',20.0],'草莓',25.0],'Brazil':[['Banana',5.0],'Greece':[['Pear',12.0],'Peru':[['Mango',3.0],'Avacado',7.0]}
>>>从集合导入defaultdict
>>>my_dict=defaultdict(列表)
>>>对于水果,价格、产地在lst1:
...     我的字典[产地].附加([水果,价格])
...
>>>我的字典
defaultdict(,{'Swiss':[['Apple',20.0],'草莓',25.0],'Brazil':[['Banana',5.0],'Greece':[['Pear',12.0],'Peru':['Mango',3.0],'Avacado',7.0]})

@MartijnPieters我的坏!我只是模仿了问题中使用的切片。但奇怪的是,使用
[:1]
切片(就像OP那样)并没有产生他们声称的输出:/他们只是纠正了他们的问题,我正要在评论中指出这一点。:-)@JoeIddon抱歉,粘贴时没有注意到。@Raja没问题,请记住接受其他人的回答,以备将来访问