我有一个列表的字典,数字作为键,字符串列表作为值.例如,
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)
对不起,如果我没有表达出明显的问题.
在你的dict中创建一组所有名称.
然后,您可以创建一个允许您构造新dict的查找表.
它使用key=len在max()选择具有子串最长的名字:
>>> 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)
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |