我有一套(任何集合類型將爲我所關心的所有人)這樣做。在Python中合併集合中的集合
myset = {{a},{b},{c},{d,e}, {d,f}}
我現在想檢查兩個元素{A}和{d}中是否存在MYSET如果是合併{A} {與d,E}。另一方面,如果我正在檢查{d}和{f},那麼我將合併{d,e}和{d,f}以得到{d,e,f}。
如果有人向我展示解決方案的方向,我將不勝感激。
我有一套(任何集合類型將爲我所關心的所有人)這樣做。在Python中合併集合中的集合
myset = {{a},{b},{c},{d,e}, {d,f}}
我現在想檢查兩個元素{A}和{d}中是否存在MYSET如果是合併{A} {與d,E}。另一方面,如果我正在檢查{d}和{f},那麼我將合併{d,e}和{d,f}以得到{d,e,f}。
如果有人向我展示解決方案的方向,我將不勝感激。
這可能不是最Python的方法,但它應該工作,讓我知道,如果它不 ,我已經做到了對列表,你可以使用類似的方法
def get_member(a,the_list):
if a in the_list:
return a
else:
for elem in the_list:
if isinstance(elem,list):
if a in elem:
return elem
return None
def merge_member(a,b,the_list):
get_member_a = get_member(a,the_list)
get_member_b = get_member(b,the_list)
if get_member_a and get_member_b:
the_list.remove(get_member_a)
the_list.remove(get_member_b)
if isinstance(get_member_b,list):
get_member_b.extend(get_member_a)
the_list.append(get_member_b)
elif isinstance(get_member_a,list):
get_member_a.extend(get_member_b)
the_list.append(get_member_a)
else:
the_list.append([get_member_b,get_member_a])
return the_list
我看來我們需要改進merge_member塊來處理這樣的情況,我們有[['a'],['b'],['c'],['d'],['e','f ','g']],作爲the_list,我們正在尋找'e'和'f'。
def merge_member(a,b,the_list):
get_member_a = get_member(a, the_list)
get_member_b = get_member(b, the_list)
if get_member_a and get_member_b:
if get_member_a.__eq__(get_member_b):
the_list.remove(get_member_a)
if isinstance(get_member_b, list):
the_list.append(get_member_b)
else:
the_list.remove(get_member_a)
the_list.remove(get_member_b)
if isinstance(get_member_b, list):
get_member_b.extend(get_member_a)
the_list.append(get_member_b)
elif isinstance(get_member_a, list):
get_member_a.extend(get_member_b)
the_list.append(get_member_a)
else:
the_list.append([get_member_b,get_member_a])
return the_list
您可以使用此方法來合併一組名單:
from functools import reduce # for python3
myset = [{'a'}, {'b'}, {'c'}, {'d','e'}, {'d','f'}]
reduce(lambda x, y: {*x, *y}, myset)
輸出:
{'a', 'b', 'c', 'd', 'e', 'f'}
解決方案的問題:
from functools import reduce # for python3
myset = [{'a'}, {'b'}, {'c'}, {'d','e'}, {'d','f'}] # define your set list
def get_element_set(elem, myset):
try:
z = [x for x in myset if elem in x]
result = reduce(lambda x, y: {*x, *y}, z)
return result
except TypeError as e:
print('Element "%s" is not exist in myset!' % elem)
return {}
def merge_member(elem_list, myset):
z = map(lambda elem: get_element_set(elem, myset), elem_list)
result = reduce(lambda x, y: {*x, *y}, z)
return result
例子:
get_element_set('d', myset) # {'d', 'e', 'f'}
get_element_set('g', myset) # Element "g" is not exist in myset! {}
merge_member(['f', 'd'], myset) # {'d', 'e', 'f'}
merge_member(['a', 'd'], myset) # {'a', 'd', 'e', 'f'}
請問您是否更詳細地解釋您的邏輯?如果{a}和{d}退出,選擇{a}的邏輯是什麼? – Nilesh 2014-11-25 07:33:08
你的問題不清楚。 – 2014-11-25 08:26:12
在這種情況下會發生什麼情況: '{{a,b},{a,c},{b,d},{b,e}}' 您正在檢查{a}和{b} – 2014-11-25 08:28:55