【问题标题】:dictionary comprehension derived from existing lists从现有列表派生的字典理解
【发布时间】:2016-09-01 23:22:25
【问题描述】:

作为更大练习的一部分,我正在尝试根据来自较小列表的输入来构建字典,但我正在为嵌入式迭代而苦苦挣扎。假设我有以下说明性示例:

cities = ['newyork','london','tokyo','paris']
citypairs = [i for i in it.combinations(cities,2)]
airlines = ['delta', 'united']

我想构建一个字典字典,“info”,它的键是上面城市 + 每个航空公司的组合(所以总共 12 个键),每个键都包含一个“city1”和一个“city2”键使用 citypairs 列表填充。我正在尝试类似:

info = {
'{city1}/{city2} {airline}'.format(city1=city1, city2=city2, airline=airline): {
    "city1": city1, "city2": city2
    for city1, city2 in citypairs
    }
    for city1, city2 in citypairs
    for airline in airlines 
   } 

但收到无效的语法错误。只是为了更清楚地说明我所追求的,如果不是上述尝试,我会这样做:

info = {
'{city1}/{city2} {airline}'.format(city1=city1, city2=city2, airline=airline): {
    "city1": "whatever", "city2": "whatever"
    }
    for city1, city2 in citypairs
    for airline in airlines 
   } 

然后这将运行并为“info”中的每个键为 city1 和 city2 简单地创建 'whatever' 的虚拟值

这个例子可能看起来很傻或过于复杂,但我的问题的核心是我如何遍历一个元组列表来填充这个例子中的 city1 和 city2 - 我在这之后是因为我正在工作的现实项目on 需要这种灵活性

【问题讨论】:

  • info 的期望值是多少?
  • 语法错误是{"city1": city1, "city2": city2 for city1, city2 in citypairs}。那应该是什么?每个条目有两个条目的字典?还是您只想将这两个都添加为单独的条目,例如{k:v for city1, city2 in citypairs for k,v in (('city1', city1), ('city2', city2))}
  • 所需示例:info[newyork/london delta][city1] 将等于“newyork”,...[city2] 将等于“London”。

标签: python list python-2.7 dictionary


【解决方案1】:

我认为解决方案比你想的要简单:

from itertools import combinations

cities = ['newyork','london','tokyo','paris']
citypairs = combinations(cities, 2)
airlines = ['delta', 'united']

info = {'{city1}/{city2} {airline}'.format(city1=city1, city2=city2, airline=airline): {"city1": city1, "city2": city2}
    for city1, city2 in citypairs
        for airline in airlines 
} 

print(info)
print()
print(info["newyork/london delta"]["city1"])

输出

{'london/tokyo delta': {'city1': 'london', 'city2': 'tokyo'}, 'newyork/london delta': {'city1': 'newyork', 'city2': '伦敦'},'伦敦/巴黎三角洲':{'city1':'伦敦','city2':'巴黎'},'伦敦/东京联合':{'city1':'伦敦','city2':'东京'},'东京/巴黎联合':{'city1':'东京','city2':'巴黎'},'纽约/巴黎三角洲':{'city1':'newyork','city2':'巴黎'},'东京/巴黎三角洲':{'city1':'东京','city2':'巴黎'},'纽约/巴黎联合':{'city1':'newyork','city2':'巴黎'},'伦敦/巴黎联合':{'city1':'伦敦','city2':'巴黎'},'纽约/伦敦联合':{'city1':'newyork','city2':'伦敦'},'纽约/东京三角洲':{'city1':'newyork','city2':'东京'},'纽约/东京联合':{'city1':'newyork','city2':'东京'}}

纽约

【讨论】:

    【解决方案2】:
    info = {
    '{city1}/{city2} {airline}'.format(**vars()) : 
        { "city1": city1, "city2": city2 }
        for city1, city2 in citypairs
        for airline in airlines 
       }
    

    产量:

    {'london/paris delta': {'city1': 'london', 'city2': 'paris'},
     'london/paris united': {'city1': 'london', 'city2': 'paris'},
     'london/tokyo delta': {'city1': 'london', 'city2': 'tokyo'},
     'london/tokyo united': {'city1': 'london', 'city2': 'tokyo'},
     'newyork/london delta': {'city1': 'newyork', 'city2': 'london'},
     'newyork/london united': {'city1': 'newyork', 'city2': 'london'},
     'newyork/paris delta': {'city1': 'newyork', 'city2': 'paris'},
     'newyork/paris united': {'city1': 'newyork', 'city2': 'paris'},
     'newyork/tokyo delta': {'city1': 'newyork', 'city2': 'tokyo'},
     'newyork/tokyo united': {'city1': 'newyork', 'city2': 'tokyo'},
     'tokyo/paris delta': {'city1': 'tokyo', 'city2': 'paris'},
     'tokyo/paris united': {'city1': 'tokyo', 'city2': 'paris'}}
    

    这里我使用了format() 的简洁形式,它查看局部变量以查找格式字符串的内容。

    您似乎非常接近您的要求。不知道为什么你用"whatever" 为你的二级dicts 提交值,因为你已经在理解中生成了city1city2 变量。只需使用这些即可完成电路。

    【讨论】:

      猜你喜欢
      • 2013-09-09
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多