我正在创建一个csv,它将用作任何给定名称的可接受昵称的参考。然后,我输入一个输入名称,浏览每一行以查看该名称是否存在,然后返回该行中的所有其他单元格,即昵称。输入名称不必在第一列中即可返回结果。但是,我是从几个不同的来源创建的列表,现在有重复的。 如果任何单元格匹配,有没有一种方法可以合并每一行?
Excel / VBA / Python中的解决方案很棒。
来自csv的示例行:
a b c d
steven steve
abigail abby abby gail
stephen steve steph
abraham ab abe
所需的输出:
a b c d
steven steve stephen steph
abigail abby abby gail
abraham ab abe
答案 0 :(得分:1)
乍看之下,我提出的解决方案似乎很不寻常,但它确实有效。
您可以建立一个名称图表,其中两个可以相互接受的昵称可以相互连接。图的连接部分是所有相互可接受的昵称的组。
首先导入networkx
(网络操作模块)和其他支持工具:
import networkx as nx
from itertools import combinations, chain
以下是CSV文件中的列表列表:
names = [['steven', 'steve'], ['abigail', 'abby', 'abby', 'gail'],
['stephen', 'steve', 'steph'], ['abraham', 'ab', 'abe']]
通过将每个子列表中的每个名称与同一子列表中的其他名称相互连接来创建边列表:
edges = chain.from_iterable(combinations(set(n), 2) for n in names)
从边缘列表构建图形:
G = nx.Graph(edges)
确定连接的组件:
[list(n) for n in nx.connected_components(G)]
#[['stephen', 'steph', 'steven', 'steve'],
# ['gail', 'abigail', 'abby'],
# ['abe', 'ab', 'abraham']]