Python - 根据前一个

时间:2018-05-30 19:06:36

标签: python python-3.x dictionary

我有一个字典,每个字都与列表相关联。例如:

a = ['apple', 'pear', 'banana']
b = ['car', 'plane', 'boat']
c = ['cat', 'dog', 'bird']
d = {'a' : a, 'b' : b, 'c' : c}

我有一个字典列表,其中每个字典中的特定键值将是一个与列表中的一个字符串匹配的字符串。如:

x = [{'thing' : 'apple'}, {'thing': 'dog'}, {'thing' : 'boat'}]

我想要做的是为每个字典添加一个键,其中值与找到字符串的列表的名称相匹配。导致:

x = [{'thing' : 'apple', 'list' : 'a'}, {'thing' : 'dog', 'list' : 'c']}, {'thing': 'boat', 'list': 'b'}]

我试过了

for k in d:
    for m in x:
        if m['thing'] in k:
            m['list'] = k

我有一种感觉,我过于复杂,但我们无法弄清楚我出错的地方。任何建议都表示赞赏。

编辑:我在文章中将其翻译成更一般的术语时忘记提及的是a,b和c中的字符串是x中找到的字符串。所以x实际上更像是x = [{' thing' :' apple |水果'},{' thing':' dog |动物'},{' thing' :'船|车辆'}]

4 个答案:

答案 0 :(得分:1)

检查此代码

a = ['apple', 'pear', 'banana']
b = ['car', 'plane', 'boat']
c = ['cat', 'dog', 'bird']
d = {'a' : a, 'b' : b, 'c' : c}

x = [{'thing' : 'apple'}, {'thing': 'dog'}, {'thing' : 'boat'}]

# with  list comprehension
nx = [{'thing' : m['thing'], 'list' : key} for key, listVals in d.items() for m in x if m['thing'] in listVals]

# normal way.
# nx = []
# for m in x:
#     for key, listVals in d.items():
#         if m['thing'] in listVals :
#             nx.append({'thing' : m['thing'], 'list' : key})

print(nx)

答案 1 :(得分:1)

一个选项是创建d的反转,其中键是每个列表中的值,值是d中的键。然后使用此反向字典更新x

首先创建逆字典:

d_inv = {d[k][i]: k for k in d for i in range(len(d[k]))}
print(d_inv)
#{'apple': 'a', 'banana': 'a', 'car': 'b', 'pear': 'a', 'dog': 'c', 'cat': 'c', 
# 'plane': 'b', 'bird': 'c', 'boat': 'b'}

这假设您没有出现在多个列表中的相同元素。

现在更新x

for elem in x:
    elem['list'] = d_inv[elem['thing']]
print(x)
[
    {'thing': 'apple', 'list': 'a'},
    {'thing': 'dog', 'list': 'c'},
    {'thing': 'boat', 'list': 'b'}
]

答案 2 :(得分:1)

我对此问题的上述评论表示赞赏。

  

在我们搜索内部关键列表并且 a b 时, c 是引用/指向列表的字典的键。 if m['thing'] in k中的 k 表示键不在列表中,因此应将其更改为 d [k]

http://rextester.com/JVRG57284

请查看下面的修改后的代码(如果您对代码不满意或者如果它不能满足您的需求或者您的任何测试用例失败,请发表评论):

import json

a = ['apple', 'pear', 'banana']
b = ['car', 'plane', 'boat']
c = ['cat', 'dog', 'bird']
d = {'a' : a, 'b' : b, 'c' : c}

x = [{'thing' : 'apple'}, {'thing': 'dog'}, {'thing' : 'boat'}]

for k in d:
    for m in x:
        if m['thing'] in d[k]:
            m['list'] = k

# pretty printing x dictionary
print(json.dumps(x, indent=4))

"""
[
    {
        "list": "a",
        "thing": "apple"
    },
    {
        "list": "c",
        "thing": "dog"
    },
    {
        "list": "b",
        "thing": "boat"
    }
]
"""

答案 3 :(得分:0)

您可以使用列表推导和字典解包:

a = ['apple', 'pear', 'banana']
b = ['car', 'plane', 'boat']
c = ['cat', 'dog', 'bird']
d = {'a' : a, 'b' : b, 'c' : c}
x = [{'thing' : 'apple'}, {'thing': 'dog'}, {'thing' : 'boat'}]
final_results = [{**i, **{'list':[a for a, b in d.items() if i['thing'] in b][0]}} for i in x]

输出:

 [{'list': 'a', 'thing': 'apple'}, {'list': 'c', 'thing': 'dog'}, {'list': 'b', 'thing': 'boat'}]