4

我有这个清单:

source = ['sourceid', 'SubSourcePontiflex', 'acq_source', 'OptInSource', 'source',
      'SourceID', 'Sub-Source', 'SubSource', 'LeadSource_295', 'Source',
      'SourceCode', 'source_code', 'SourceSubID']

我在 python 中迭代 XML 以为每个子节点创建一个字典。字典的长度和键随每次迭代而变化。有时字典将包含一个键,该键也是此列表中的一个项目。有时它不会。我想要做的是,如果字典中的一个键也是这个列表中的一个项目,那么将该值附加到一个新列表中。如果字典中的所有键都不在列表源中,我想附加一个默认值。我真的对如何做到这一点感到困惑。任何帮助,将不胜感激。

4

5 回答 5

7

只需使用in关键字来检查字典中某个键的成员资格。

以下示例将打印[3, 1],因为 3 和 1 是字典中的键,也是列表的元素。

someList = [8, 9, 7, 3, 1]
someDict = {1:2, 2:3, 3:4, 4:5, 5:6}
intersection = [i for i in someList if i in someDict]
print(intersection)

您可以intersection在每次迭代时检查此列表是否为空。如果列表为空,则您知道列表中的任何项目都不是字典中的键。

于 2013-09-11T19:01:45.640 回答
4
in_source_and_dict = set(mydict.keys()).intersection(set(source))
in_dict_not_source = set(mydict.keys()) - set(source)
in_source_not_dict = set(source) - set(mydict.keys())

迭代你想要的结果。在这种情况下,我猜你会想要迭代in_source_not_dict以提供默认值。

于 2013-09-11T18:57:07.247 回答
2

在 Python 3 中,您可以直接对返回的对象执行集合操作dict.keys()

in_source_and_dict = mydict.keys() & source
in_dict_not_source = mydict.keys() - source
in_source_not_dict = source - mydict.keys()

.keys()如果你替换为.这也适用于 Python 2.7 .viewkeys()

于 2013-09-11T19:07:17.417 回答
1
my_dict = { some values }
values = []
for s in sources:
    if my_dict.get(s):
        values += [s]
if not values:
    values += [default]

您可以遍历源数组并查看字典中是否存在该源的值。如果有,请将其附加到值。在该循环之后,如果值为空,则附加默认值。

请注意,如果您的字典中有键值对 (val, None),那么您不会将 None 值附加到列表的末尾。如果这是一个问题,您可能不想使用此解决方案。

于 2013-09-11T19:03:35.843 回答
1

您可以使用该any()功能执行此操作

dict = {...}
keys = [...]
if not any(key in dict for key in keys):
    # no keys here

等效地,使用all()(德摩根定律):

if all(key not in dict for key in keys):
    # no keys here
于 2013-09-11T19:03:54.760 回答