【问题标题】:Appending to list of tuples with dictionary elements from input lists使用输入列表中的字典元素附加到元组列表
【发布时间】:2018-09-28 14:15:36
【问题描述】:

我有两个这样的列表:

my_list = [['can you change departure date to 30th March', '207443006734608218498'], ['can you downgrade to economy class?', '276566920664343421717'], ['book flight from San Francisco to Los Angeles on April 17-24', '897058868855606085615']]

ids_list = ['207443006734608218498', '276566920664343421717', '897058868855606085615']

我检查 my_list 中匹配的元素的 ids_list 然后我尝试附加到其他列表中

我试着得到最终的名单:

[
  ('can you change departure date to 30th March',
  {
    'ids': {
      '207443006734608218498': 'True',
      '276566920664343421717': 'False',
      '897058868855606085615': 'False'
    }
  }),
  ('can you downgrade to economy class?',
  {
    'ids': {
      '207443006734608218498': 'False',
      '276566920664343421717': 'True',
      '897058868855606085615': 'False'
    }
  }),
  ('book flight from San Francisco to Los Angeles on April 17-24',
  {
    'ids': {
      '207443006734608218498': 'False',
      '276566920664343421717': 'False',
      '897058868855606085615': 'True'
    }
  })
]

为此,我编写了简单的循环并像这样更新字典的元组

>>> data = {} 
>>> for x in my_list:
...     for y in ids_list:
...             data.update({y: "True"} if x[1]==y  else {y: "False"})
...     print((x[0],{"ids": data}))
... 

('can you change departure date to 30th March', {'ids': {'207443006734608218498': 'True', '276566920664343421717': 'False', '897058868855606085615': 'False'}})
('can you downgrade to economy class?', {'ids': {'207443006734608218498': 'False', '276566920664343421717': 'True', '897058868855606085615': 'False'}})
('book flight from San Francisco to Los Angeles on April 17-24', {'ids': {'207443006734608218498': 'False', '276566920664343421717': 'False', '897058868855606085615': 'True'}})

但是当我在列表中追加时,当我打印时数据字典附加了错误的值,那么数据字典值是正确的 我应该做错什么?

>>> t = []
>>> for x in my_list:
...     for y in ids_list:
...             data.update({y: "True"} if x[1]==y  else {y: "False"})
...     t.append((x[0],{"ids":data}))
... 
>>> t
    [
 ('can you change departure date to 30th March', {'ids': {'207443006734608218498': 'False', '276566920664343421717': 'False', '897058868855606085615': 'True'}}),
 ('can you downgrade to economy class?', {'ids': {'207443006734608218498': 'False', '276566920664343421717': 'False', '897058868855606085615': 'True'}}), 
 ('book flight from San Francisco to Los Angeles on April 17-24', {'ids': {'207443006734608218498': 'False', '276566920664343421717': 'False', '897058868855606085615': 'True'}})]

【问题讨论】:

  • 您不断重复使用相同的 data 引用并就地修改它。完成后,整个列表中只会显示最后一次修改。
  • @MadPhysicist 对!!但是如何附加正确的数据字典?

标签: python python-3.x dictionary


【解决方案1】:

问题出在这一行:

data.update({y: "True"} if x[1]==y  else {y: "False"})

它会就地更新data,而不是将名称重新绑定到新的字典对象。为了更好地理解,让我们看看通过“展开”循环来真正放入 t 的内容:

t = [(my_list[0][0], {'ids': data}), (my_list[1][0], {'ids': data}), (my_list[2][0], {'ids': data})]

请注意,虽然外部字典(带有'ids')每次都是一个不同的对象,但内部字典始终是对同一个data 对象的引用。您对 data 所做的任何更改都将在列表中的每个元素中可见。

解决方案当然是在循环的每次迭代中创建一个新对象。我能想到的最简单的方法是将你的内部循环变成字典理解:

t = []
for x in my_list:
    data = {id: "True" if x[1] == id  else "False" for id in ids}
    t.append((x[0], {"ids": data}))

您可以进行的另一项改进是解压缩 x 以使代码更清晰:

t = []
for request, id in my_list:
    data = {x: "True" if id == x  else "False" for x in ids}
    t.append((request, {"ids": data}))

最后,如果你应该选择的话,你的整个代码很简单,可以坚持单行列表理解:

t = [(request, {"ids": {x: "True" if id == x  else "False" for x in ids}}) for request, id in my_list]

【讨论】:

    【解决方案2】:

    您可以通过列表理解来重构您的逻辑。

    此外,将您的输入 my_list 转换为字典以提高性能。

    my_list = [['can you change departure date to 30th March', '207443006734608218498'], ['can you downgrade to economy class?', '276566920664343421717'], ['book flight from San Francisco to Los Angeles on April 17-24', '897058868855606085615']]
    
    ids_list = ['207443006734608218498', '276566920664343421717', '897058868855606085615']
    
    my_list_dict = dict(my_list)
    
    res = [(k, {'id': {my_id: my_id == my_list_dict[k] for my_id in ids_list}}) \
           for k, v in my_list_dict.items()]
    

    结果

    [('can you change departure date to 30th March',
      {'id': {'207443006734608218498': True,
              '276566920664343421717': False,
              '897058868855606085615': False}}),
     ('can you downgrade to economy class?',
      {'id': {'207443006734608218498': False,
              '276566920664343421717': True,
              '897058868855606085615': False}}),
     ('book flight from San Francisco to Los Angeles on April 17-24',
      {'id': {'207443006734608218498': False,
              '276566920664343421717': False,
              '897058868855606085615': True}})]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多