我有一本這樣的字典,
matches = {'2-8-7 Yaesu, Chuo-Ku': ['Chuo Ward, Yaesu 2-8-7'],
'Chuo Ward, Yaesu 2-8-7': ['2-8-7 Yaesu, Chuo-Ku'],
'Fukuoka Bldg 10Th Floor': ['Fukuoka Building, 9Th -10Th Flr.'],
'Fukuoka Bldg. 8-7 Yaesu Chome': ['2-8-7 Yaesu, Chuo-Ku',
'Fukuoka Building, 8-7, Yaesu 2 Chome, Chuo-Ku'],
'Fukuoka Bldg. 9Th Fl': ['Fukuoka Building 9Th Floor'],
'Fukuoka Building 9Th Floor': ['Fukuoka Bldg. 9Th Fl',
'Fukuoka Building, 9Th -10Th Flr.']}
我想通過查找鏈接(帶有鍵或值)將它們組合在一起,鍵可以是任何東西(或)只是你遇到的第一個鍵是起點。
這是我期待的理想輸出,
{'2-8-7 Yaesu, Chuo-Ku': ['Chuo Ward, Yaesu 2-8-7',
'2-8-7 Yaesu, Chuo-Ku',
'Fukuoka Building, 8-7, Yaesu 2 Chome, Chuo-Ku',
'Fukuoka Bldg. 8-7 Yaesu Chome'],
'Fukuoka Bldg 10Th Floor': ['Fukuoka Building, 9Th -10Th Flr.',
'Fukuoka Bldg. 9Th Fl',
'Fukuoka Building 9Th Floor',
'Fukuoka Bldg. 9Th Fl']}
我試過這個,
unique_lst = set()
merged_matches = dict()
for key, values in matches.items():
if key not in unique_lst:
values_lst = []
for v in values:
output = matches.get(v)
for subkeys, subvals in matches.items():
if key != subkeys and v != subkeys:
keyvals = [subkeys] list(subvals)
if v in keyvals:
values_lst.extend(keyvals)
if output:
values_lst.extend(output)
values_lst.append(v)
values_lst = [i for i in values_lst if i != key]
values_lst = values_lst [key]
for v in values_lst:
unique_lst.add(v)
merged_matches[key] = values_lst
這是我得到的輸出,
# print(merged_matches)
{'Fukuoka Bldg. 9Th Fl': ['Fukuoka Building, 9Th -10Th Flr.',
'Fukuoka Building 9Th Floor',
'Fukuoka Bldg. 9Th Fl'],
'Fukuoka Bldg. 8-7 Yaesu Chome': ['Chuo Ward, Yaesu 2-8-7',
'2-8-7 Yaesu, Chuo-Ku',
'Chuo Ward, Yaesu 2-8-7',
'2-8-7 Yaesu, Chuo-Ku',
'Fukuoka Building, 8-7, Yaesu 2 Chome, Chuo-Ku',
'Fukuoka Bldg. 8-7 Yaesu Chome'],
'Fukuoka Bldg 10Th Floor': ['Fukuoka Building 9Th Floor',
'Fukuoka Bldg. 9Th Fl',
'Fukuoka Building, 9Th -10Th Flr.',
'Fukuoka Building, 9Th -10Th Flr.',
'Fukuoka Bldg 10Th Floor']}
uj5u.com熱心網友回復:
IMO,問題歸結為找到由字典引起的圖的連通分量。您可以這樣做的一種方法是使用 UnionFind 資料結構來獲取從鍵和值構造的不相交集的串列。
然后我們可以通過選擇一個元素作為鍵,其余元素作為值,從合并的集合中構造一個字典。
from networkx.utils.union_find import UnionFind
c = UnionFind()
for k, lst in matches.items():
c.union(*[k, *lst])
out = {k: v for k, *v in map(list, c.to_sets())}
輸出:
{'Chuo Ward, Yaesu 2-8-7': ['2-8-7 Yaesu, Chuo-Ku',
'Fukuoka Bldg. 8-7 Yaesu Chome',
'Fukuoka Building, 8-7, Yaesu 2 Chome, Chuo-Ku'],
'Fukuoka Building 9Th Floor': ['Fukuoka Bldg 10Th Floor',
'Fukuoka Bldg. 9Th Fl',
'Fukuoka Building, 9Th -10Th Flr.']}
uj5u.com熱心網友回復:
嘗試使用networkx網路圖包進行創意。這個想法是您的問題可以翻譯為“將地址分類為組,組之間沒有聯系”。
所以 networkx 在這里聽起來像是一個方便的解決方案。
了解問題,
Denote the following:
1 '2-8-7 Yaesu, Chuo-Ku',
2 'Chuo Ward, Yaesu 2-8-7',
3 'Fukuoka Bldg 10Th Floor',
4 'Fukuoka Bldg. 8-7 Yaesu Chome',
5 'Fukuoka Bldg. 9Th Fl',
6 'Fukuoka Building 9Th Floor',
7 'Fukuoka Building, 8-7, Yaesu 2 Chome, Chuo-Ku',
8 'Fukuoka Building, 9Th -10Th Flr.'
---------
Reading from your original list of dictionaries, the addresses have the following relationships:
1 -> 2
2 -> 1
3 -> 8
4 -> 1
4 -> 7
5 -> 6
6 -> 5
6 -> 8
The final output is two dictionaries:
(1, 2, 7, 4) and (3, 5, 8, 6).
(1, 2, 7, 4) 和 (3, 5, 8, 6) 就是我們所說的連通分量。因此,以下實作:
matches = {'2-8-7 Yaesu, Chuo-Ku': ['Chuo Ward, Yaesu 2-8-7'],
'Chuo Ward, Yaesu 2-8-7': ['2-8-7 Yaesu, Chuo-Ku'],
'Fukuoka Bldg 10Th Floor': ['Fukuoka Building, 9Th -10Th Flr.'],
'Fukuoka Bldg. 8-7 Yaesu Chome': ['2-8-7 Yaesu, Chuo-Ku',
'Fukuoka Building, 8-7, Yaesu 2 Chome, Chuo-Ku'],
'Fukuoka Bldg. 9Th Fl': ['Fukuoka Building 9Th Floor'],
'Fukuoka Building 9Th Floor': ['Fukuoka Bldg. 9Th Fl',
'Fukuoka Building, 9Th -10Th Flr.']}
import networkx as nx
G = nx.Graph()
for k,v in matches.items():
G.add_node(k)
for i in v:
G.add_node(i)
G.add_edge(k, i)
groups = list(nx.connected_components(G))
最終結果groups是一個集合串列,其中每個集合都是一個孤立的組。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466427.html
標籤:Python python-3.x 字典
上一篇:如何在pythonpandas中使用urlparse
下一篇:Python找不到指定的檔案
