Python在迭代两个字典并从中创建一个新字典时,某些元素被排序错误

时间:2017-04-10 18:48:17

标签: python dictionary

我有两本词典。一个人有一个ID作为关键(电影ID)和一个包含一些名字作为价值的字符串(在这部电影中扮演的演员),像这样

fid_description = {1000: 'Tim Robbins, Morgan Freeman, Bob Gunton, Wialliam Sadler', 
                   1001: 'Marlon Brando, Al Pacino, James Caan, Diane Keaton', 
                   1002: 'Al Pacino, Robert De Niro, Robert Duvall, Diane Keaton', 
                   1003: 'Christian Bale, Heath Ledger, Aaron Eckhart, Michael Caine', 
                   1004: 'Henry Fonda, Lee J', 
                   1005: 'Liam Neeson, Ralph Fiennes, Ben Kingsley, Caroline Goodall'}

另一个dict也有一个ID作为键,并且值为一个列表,其中包含actor的名字和姓氏作为字符串,如下所示

dict_actors = {10000: ['Tim', 'Robins'], 10001: ['Morgan', 'Freeman'], 
10002: ['Bob', 'Gunton'], 10003: ['William', 'Sadler'], 10004: ['Marlon', 'Brando'], 
10005: ['Al', 'Pacino'], 10006: ['James', 'Caan'], 10007: ['Diane', 'Keaton'], 
10008: ['Robert', 'De Niro'], 10009: ['Robert', 'Duvall'], 
10010: ['Christian', 'Bale'], 10011: ['Heath', 'Ledger'], 
10012: ['Aaron', 'Eckhart'], 10013: ['Michael', 'Caine'], 
10014: ['Henry', 'Fonda'], 10015: ['Lee', 'J']

现在很抱歉从我的dicts中发布了这么多,但是包含第二个dict的ID 10015的输出是我无法向自己解释的。

所以我现在要做的是创建一个新的dict,它作为一个键包含actor ID,并且作为一个值列出了actor扮演角色的电影ID。我为此写了以下代码:

aid_fid = {}
for k, v in fid_description.items():
    for key, value in dict_actors.items():
        if value[0] and value[1] in v:
            aid_fid[key].append(k)
        else:
            aid_fid.update({key:[k]})

输出大多是我所期望的。 aid_fid的开头看起来像这样:

{10000: [1000], 10001: [1000], 10002: [1000], 10003: [1000], 10004: [1001], 
10005: [1001, 1002], 10006: [1001], 10007: [1001, 1002], 
10015: [1001, 1004]}

正如你所看到的那些扮演多部影片的演员的ID也被正确地分配给电影ID,但是在演员身份10007之后它不会继续10008而是10015,并且它分配了一个错误该键的值(1001不属于那里)。在10015之后,它继续使用10008,10009,依此类推,并正确地将正确的值添加到这些键。为什么带有键10015的元素位于错误的位置并且具有错误的值?

我认为正在发生的是它正在我的第一个字典的值中查找字符串“Lee”和“J”并正确地在匹配1004的值中找到它们,但它似乎也找到了这两个字符串我的密钥1001的值,不应该是这种情况。任何人都可以向我解释这个输出吗?感谢。

1 个答案:

答案 0 :(得分:0)

if value[0] and value[1] in v:检查value[0]是否真实,然后检查value[1]中是否包含v。这可能不是你想要做的。

如果你想检查两者是否都包含在内,你应该使用:

if value[0] in v and value[1] in v:

或:

if all(name_part in v for name_part in value):

或者如果你想检查它们是否包含在由空格分隔的相同顺序的同一个地方:

if " ".join(value) in v:  # checks if e.g. "Lee J" is contained in "v".