Python 使用输入列表中的字典元素追加到元组列表

Python 使用输入列表中的字典元素追加到元组列表,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有两个类似的清单: 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'

我有两个类似的清单:

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']
我检查我的元素列表中匹配的元素的ID列表,然后尝试附加到其他列表中

我试着得到最后的列表:

[
  ('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'}})
但当我在列表中追加数据时,当我打印时,数据dict追加了错误的值,即为ablove,则数据dict值是正确的 我应该做错什么

>>> 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.update({y: "True"} if x[1]==y  else {y: "False"})
它就地更新
数据
,而不是将名称重新绑定到新的dictionary对象。为了更好地理解,让我们看看通过“展开”您的循环在
t
中真正得到了什么:

t = [(my_list[0][0], {'ids': data}), (my_list[1][0], {'ids': data}), (my_list[2][0], {'ids': data})]
请注意,虽然外部字典(带有
'id'
)每次都是一个不同的对象,但内部字典始终是对相同
数据
对象的引用。对
数据所做的任何更改都将在列表中的每个元素中可见

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

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]

您可以通过列表理解来重新构造逻辑

此外,将输入的
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}})]

您不断重复使用相同的
数据
引用,并对其进行适当的修改。完成后,列表中只显示最后一次修改。@madpysicator right!!但是如何添加正确的数据dict呢?