Python仅通过键添加到字典

时间:2018-12-31 11:31:51

标签: python dictionary

比方说,我有一座城市(价值)和人(钥匙)。 1个城市可以有很多人。

(例如。): 代码:

cities = {'Berlin':{'Dan', 'john'},'Tokyo':{'John'}}
city_dict = {}
people = {}
for city in cities:
   ?

我想用python构造一个字典,仅在键之间出现匹配时才插入。

(例如所需的结果。):

{'dan' : {'dan':'berlin','dan':'colorado'},'john' : {'john':'berlin','john':'Tokyo'}}

谢谢。

3 个答案:

答案 0 :(得分:3)

期望的结果无法实现,因为按照定义,词典不能包含重复的键。

但是,您可以执行以下操作(某种程度上接近您想要的输出):

from collections import defaultdict

cities = {'Berlin': {'Dan', 'John'}, 'Tokyo': {'John'}}
output = defaultdict(set)

for city, names in cities.items():
    for name in names:
        output[name].add(city)
print(output)
# defaultdict(<class 'set'>, {'Dan': {'Berlin'}, 'John': {'Berlin', 'Tokyo'}})

答案 1 :(得分:2)

其他选项,没有依赖项并且返回城市列表:

cities = {'Berlin':{'Dan', 'John'},'Tokyo':{'John', 'Paul'}, 'Liverpool':{'John', 'Paul', 'George', 'Ringo'}, 'Colorado':{'Ringo'} }

res = {}
for k, v in cities.items():
  for e in v:
    res.setdefault(e,[]).append(k)

print(res)
#=> {'Dan': ['Berlin'], 'John': ['Berlin', 'Tokyo', 'Liverpool'], 'Paul': ['Tokyo', 'Liverpool'], 'Ringo': ['Liverpool', 'Colorado'], 'George': ['Liverpool']}

答案 2 :(得分:1)

您不能在字典中指定重复的键,例如@DeepSpace,因此对于您的问题,我建议您使用以下替代方法。 使用带有人名的字典作为关键字和城市价值。因此,当您需要结合使用两者来创建列表元组时,等等。

people = {"Dan": ["Berlin","San Francisco"], "Mario": ["Rome"]}

for name, locations in people:
  #combine name with single city if needed
  for city in locations:
    tuple_tmp = (name,city)
    #next store it, print it,...

这种方法的缺点是:

  • 您需要处理值
  • 如果您有城市并且想要检索此名称中的所有名称,则操作非常缓慢。 您可以使用倒置关系维护另一个结构,但是这会消耗内存。