2014-11-25 70 views
-1

我有一套(任何集合類型將爲我所關心的所有人)這樣做。在Python中合併集合中的集合

myset = {{a},{b},{c},{d,e}, {d,f}} 

我現在想檢查兩個元素{A}和{d}中是否存在MYSET如果是合併{A} {與d,E}。另一方面,如果我正在檢查{d}和{f},那麼我將合併{d,e}和{d,f}以得到{d,e,f}。

如果有人向我展示解決方案的方向,我將不勝感激。

+5

請問您是否更詳細地解釋您的邏輯?如果{a}和{d}退出,選擇{a}的邏輯是什麼? – Nilesh 2014-11-25 07:33:08

+0

你的問題不清楚。 – 2014-11-25 08:26:12

+0

在這種情況下會發生什麼情況: '{{a,b},{a,c},{b,d},{b,e}}' 您正在檢查{a}和{b} – 2014-11-25 08:28:55

回答

2

這可能不是最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 
+0

非常感謝。我會測試它並回復你。 – Jermi 2014-11-25 13:46:47

+0

這對我很好。將其更改爲集是一個問題,但是python集不接受[不可用]集或列表作爲元素。無論如何,我至少有一個解決問題的手。 – Jermi 2014-11-26 10:19:59

+0

是的,你必須使用frozensets,但我認爲你已經知道了。 – 2014-11-26 10:25:57

0
的套做

我看來我們需要改進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 
0

您可以使用此方法來合併一組名單:

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'}