У меня есть список списка, как в приведенном мной коде. Я хочу связать каждый дополнительный список, если есть общие значения. Затем я хочу заменить список списка сокращенным списком списка. Примеры:, если у меня есть список [[1,2,3],[3,4]]
Я хочу [1,2,3,4]
. Если у меня есть [[4,3],[1,2,3]]
, я хочу [4,3,1,2]
. Если у меня есть [[1,2,3],[a,b],[3,4],[b,c]]
, я хочу [[1,2,3,4],[a,b,c]]
или [[a,b,c],[1,2,3,4]]
Мне все равно, какой из них.
Я почти там...
Моя проблема в том, что у меня есть случай вроде [[1,2,3],[10,5],[3,8,5]]
Я хочу [1,2,3,10,5,8]
, но с моим текущим кодом я получаю [1,2,3,8,10,5]
Вот мой код:
import itertools
a = [1,2,3]
b = [3,4]
i = [21,22]
c = [88,7,8]
e = [5,4]
d = [3, 50]
f = [8,9]
g= [9,10]
h = [20,21]
lst = [a,b,c,i,e,d,f,g,h,a,c,i]*1000
#I have a lot of list but not very many different lists
def any_overlap(a, b):
sb = set(b)
return any(itertools.imap(sb.__contains__, a))
def find_uniq(lst):
''' return the uniq parts of lst'''
seen = set()
seen_add = seen.add
return [ x for x in lst if x not in seen and not seen_add(x)]
def overlap_inlist(o_lst, lstoflst):
'''
Search for overlap, using "any_overlap", of a list( o_lst) in a list of lists (lstoflst).
If there is overlap add the uniq part of the found list to the search list, and keep
track of where that list was found
'''
used_lst =[ ]
n_lst =[ ]
for lst_num, each_lst in enumerate(lstoflst):
if any_overlap(o_lst,each_lst):
n_lst.extend(each_lst)
used_lst.append(lst_num)
n_lst= find_uniq(n_lst)
return n_lst, used_lst
def comb_list(lst):
'''
For each list in a list of list find all the overlaps using 'ovelap_inlist'.
Update the list each time to delete the found lists. Return the final combined list.
'''
for updated_lst in lst:
n_lst, used_lst = overlap_inlist(updated_lst,lst)
lst[:] = [x for i,x in enumerate(lst) if i not in used_lst]
lst.insert(0,n_lst)
return lst
comb_lst = comb_list(lst)
print comb_lst
Вывод из этого script:
[[88, 7, 8, 9, 10], [1, 2, 3, 4, 50, 5], [21, 22, 20]]
Я хочу, чтобы ключ находился в исходном порядке, например:
[[88, 7, 8, 9, 10], [1, 2, 3, 4, 5, 50,], [21, 22, 20]]
5 и 50 переключаются в новый lst [2]
Я немного новичок в python. Я был бы признателен за любые решения проблемы или комментарии по моему текущему коду. Я не компьютерные ученые, я полагаю, что может быть какой-то алгоритм, который делает это быстро (может быть, из теории множеств?). Если есть такой алгоритм, укажите на правильное направление.
Я могу сделать этот способ более сложным, чем это... Спасибо!!