比较列表的Python字典中的值

Zlo*_*Zlo 3 python dictionary

我有一个列表的字典,数字作为键,字符串列表作为值.例如,

my_dict = {
    1: ['bush', 'barck obama', 'general motors corporation'],
    2: ['george bush', 'obama'],
    3: ['general motors', 'george w. bush']
}
Run Code Online (Sandbox Code Playgroud)

我想要的是比较每个列表中的每个项目(对于每个键),如果该项目是另一个项目的子字符串 - 将其更改为更长的项目.所以,这是一种非常糟糕的共识解决方案.

无法真正地围绕着如何做到这一点.这是我的想法的伪代码:

for key, value in dict:
    for item in value:
        if item is substring of other item in any other key, value:
            item = other item
Run Code Online (Sandbox Code Playgroud)

所以我的词典最终会看起来像这样:

my_dict = {
    1: ['george w. bush', 'barck obama', 'general motors corporation'],
    2: ['george w. bush', 'barck obama'],
    3: ['general motors corporation', 'george w. bush']
}
Run Code Online (Sandbox Code Playgroud)

对不起,如果我没有表达出明显的问题.

ACh*_*ion 6

在你的dict中创建一组所有名称.
然后,您可以创建一个允许您构造新dict的查找表.
它使用key=lenmax()选择具有子串最长的名字:

>>> s = {n for v in my_dict.values() for n in v}
>>> lookup = {n: max((a for a in s if n in a), key=len) for n in s}
>>> {k: [lookup[n] for n in v] for k, v in my_dict.items()}
{1: ['george w. bush', 'barck obama', 'general motors corporation'],
 2: ['george bush', 'barck obama'],
 3: ['general motors corporation', 'george w. bush']}
Run Code Online (Sandbox Code Playgroud)

或者你可以做到这一点max():

>>> s = {n for v in my_dict.values() for n in v}
>>> {k: [max((a for a in s if n in a), key=len) for n in v] for k, v in my_dict.items()}
{1: ['george w. bush', 'barck obama', 'general motors corporation'],
 2: ['george bush', 'barck obama'],
 3: ['general motors corporation', 'george w. bush']}
Run Code Online (Sandbox Code Playgroud)

要获得所需的输出,您需要稍微不同的匹配条件,而不仅仅是子字符串:

>>> s = {n for v in my_dict.values() for n in v}
>>> {k: [max((a for a in s if all(w in a for w in n.split())), key=len) for n in v] for k, v in my_dict.items()}
{1: ['george w. bush', 'barck obama', 'general motors corporation'],
 2: ['george w. bush', 'barck obama'],
 3: ['general motors corporation', 'george w. bush']}
Run Code Online (Sandbox Code Playgroud)