问题描述
这可能是一个更简单的问题,但我似乎不知道该怎么做。 我有一个包含字符串的列表,例如
my_list = ["a_foo","b_foo"]
。
my_dict = {"key_foo": ["a_bar"],"another_foo": ["c_bar","False"]}
。
我尝试编写一个列表推导式,当列表不包含“False”时,将所有键值对附加到我现有的列表中。就是这样
my_list.extend([[key,value] for (key,value) in my_dict.items() if 'False' not in value])
我得到输出 ["a_foo","b_foo",["key_foo",["a_bar"]]]
。我完全理解为什么会发生这种情况,但是,我无法找到一种方法来使输出看起来像这样:["a_foo","key_foo",["a_bar"]]
。有人可以解释一下怎么做吗?我真的很感激!
解决方法
这是为了执行此操作而对您的代码进行的修改:
my_list = ["a_foo","b_foo"]
my_dict = {"key_foo": ["a_bar"],"another_foo": ["c_bar","False"]}
[my_list.extend([key,value]) for (key,value) in my_dict.items() if 'False' not in value]
多行操作也可以:
my_list = ["a_foo","False"]}
for (key,value) in my_dict.items():
if 'False' not in value:
my_list.extend([key,value])
当您在多行中执行此操作时,现在更清楚为什么您的原始代码不起作用。这是因为前面的代码将每个键值对附加为一个元素,而我们想要实现的是将键和值附加为两个单独的元素。将 extend
方法移动到内部循环中可防止将键值对用作一个元素。
编辑:
这是如何通过“扁平化”数组而不是在列表理解中做到这一点
my_list = ["a_foo","False"]}
my_list.extend([i for pair in my_dict.items() for i in pair if "False" not in pair[1]])
,
您已接近列表推导式的结果。过滤掉不包含 'False'
的值后,您只需遍历元组 (key,values)
,即返回 key
,然后返回 values
:
>>> my_list = ["a_foo","b_foo"]
>>> my_dict = {"key_foo": ["a_bar"],"False"]}
>>> my_list.extend([e for k,vs in my_dict.items() if 'False' not in vs for e in (k,vs)])
>>> my_list
['a_foo','b_foo','key_foo',['a_bar']]