如何从列表中的列表创建字典键?

3

字符串列表:

['Georgie Porgie', 87, '$$$', ['Canadian', 'Pub Food'], 'Queen St. Cafe', 82, '$', ['Malaysian', 'Thai'], 'Dumplings R Us', 71, '$', 'Chinese', 'Mexican Grill', 85, '$$', 'Mexican', 'Deep Fried Everything', 52, '$', 'Pub Food']

我尝试从上面的列表中创建一个cuisine_to_names字典。菜系在索引3处,有时候是一个小型列表。餐厅名称位于索引0处。每隔四个索引重复一次餐厅名称。菜系为3 :: 4,名称为0 :: 4。
我的问题是从3 :: 4索引中提取元素并将它们作为键。我认为问题在于有时它们是字符串的小列表,有时只是字符串。这使得对我来说使用defaultdict很困难,但我是第一次学习该函数。我看到其他答案包括类似setdefault的东西,但我不知道如何在这种情况下使用它。任何指导都将不胜感激!
我想要这个输出:
Cuisine to list of restaurant names:
# dict of {str, list of str}
{'Canadian': ['Georgie Porgie'],
 'Pub Food': ['Georgie Porgie', 'Deep Fried Everything'],
 'Malaysian': ['Queen St. Cafe'],
 'Thai': ['Queen St. Cafe'],
 'Chinese': ['Dumplings R Us'],
 'Mexican': ['Mexican Grill']}

我尝试了这个,得到了 TypeError: unhashable type: 'list' 错误:
from collections import defaultdict

cuisine_to_name = defaultdict(list)
for cuisine, name in zip(contents_list_2[3::4], contents_list_2[::4]):
  cuisine_to_name[cuisine].append(name)

print(cuisine_to_name)
2个回答

6
问题在于变量是一个列表,而你试图将其用作字典的键。请改为以下操作:
import pprint
from collections import defaultdict

data = ['Georgie Porgie', 87, '$$$', ['Canadian', 'Pub Food'],
        'Queen St. Cafe', 82, '$', ['Malaysian', 'Thai'],
        'Dumplings R Us', 71, '$', 'Chinese',
        'Mexican Grill', 85, '$$', 'Mexican',
        'Deep Fried Everything', 52, '$', 'Pub Food']

res = defaultdict(list)
for v, k in zip(data[::4], data[3::4]):
    ks = k if isinstance(k, list) else [k]
    for ki in ks:
        res[ki].append(v)

pprint.pprint(dict(res))

输出

{'Canadian': ['Georgie Porgie'],
 'Chinese': ['Dumplings R Us'],
 'Malaysian': ['Queen St. Cafe'],
 'Mexican': ['Mexican Grill'],
 'Pub Food': ['Georgie Porgie', 'Deep Fried Everything'],
 'Thai': ['Queen St. Cafe']}

0

如果 l 是你的列表,你可以执行以下操作:

l=['Georgie Porgie', 87, '$$$', ['Canadian', 'Pub Food'],
   'Queen St. Cafe', 82, '$', ['Malaysian', 'Thai'],
   'Dumplings R Us', 71, '$', 'Chinese',
   'Mexican Grill', 85, '$$', 'Mexican',
   'Deep Fried Everything', 52, '$', 'Pub Food']

res={l[i]:l[i+3] if type(l[i+3])==list else [l[i+3]]  for i in range(0,len(l),4)}

>>>print(res)

{'Georgie Porgie': ['Canadian', 'Pub Food'], 'Queen St. Cafe': ['Malaysian', 'Thai'], 'Dumplings R Us': ['Chinese'], 'Mexican Grill': ['Mexican'], 'Deep Fried Everything': ['Pub Food']}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接