Python - 唯一序列列表

时间:2018-03-11 17:46:24

标签: python set

我有一个字典,其元素是某些序列的列表:

a = {'seq1':['5', '4', '3', '2', '1', '6', '7', '8', '9'], 
     'seq2':['9', '8', '7', '6', '5', '4', '3', '2', '1'],
     'seq3':['5', '4', '3', '2', '1', '11', '12', '13', '14'],
     'seq4':['15', '16', '17'],
     'seq5':['18', '19', '20', '21', '22', '23'],
     'seq6':['18', '19', '20', '24', '25', '26']}

所以有6个序列

我需要做的是:

  • 要查找唯一的列表(如果两个列表包含相同的元素(不管它们的顺序如何),它们并不是唯一的) - 说我需要删除第二个列表(第一个创建的唯一列表将保留)
  • 在唯一列表中,我需要找到元素和打印的唯一子序列 它

通过元素顺序的相似性找到了唯一序列的界限 - 在第1和第3列表中,绑定的末尾恰好在元素' 1'之后,因此我们得到子序列[' 5&#39 ;,' 4'&#39 3'&#39 2'' 1']

结果我希望看到的元素与开头时的完全相同(如果它可能以某种方式完成)。所以我希望如此:

[['5', '4', '3', '2', '1']['6', '7', '8', '9']['11', '12', '13', '14']['15', '16', '17']['18', '19', '20']['21', '22', '23']['24', '25', '26']]

试图这样做:

import itertools

unique_sets = []

a = {'seq1':["5","4","3","2","1","6","7","8","9"], 'seq2':["9","8","7","6","5","4","3","2","1"], 'seq3':["5","4","3","2","1","11","12","13","14"], 'seq4':["15","16","17"], 'seq5':["18","19","20","21","22","23"], 'seq6':["18","19","20","24","25","26"]}

b = []

for seq in a.values():
    b.append(seq)

for seq1, seq2 in itertools.combinations(b,2):                                     #searching for intersections 
    if set(seq1).intersection(set(seq2)) not in unique_sets:
        #if set(seq1).intersection(set(seq2)) == set(seq1):
            #continue
        unique_sets.append(set(seq1).intersection(set(seq2)))
    if set(seq1).difference(set(seq2)) not in unique_sets:
        unique_sets.append(set(seq1).difference(set(seq2)))

for it in unique_sets:
    print(it)

我得到的这与我的期望有点不同:

{'9', '5', '2', '3', '7', '1', '4', '8', '6'}
set()
{'5', '2', '3', '1', '4'}
{'9', '8', '6', '7'}
{'5', '2', '14', '3', '1', '11', '12', '4', '13'}
{'17', '16', '15'}
{'19', '20', '18'}
{'23', '21', '22'}

在上面的代码中没有评论,结果更糟。

另外,我遇​​到了集合中无序元素的问题,我得到了结果。试图用两个单独的列表来做到这一点:

seq1 = set([1,2,3,4,5,6,7,8,9])
seq2 = set([1,2,3,4,5,10,11,12])

它运作良好 - 元素并没有改变它们在集合中的位置。我的错误在哪里?

感谢。

更新:好的,现在我有一个更复杂的任务,在哪里提供alghorithm不工作

我有这本词典:

precond = {

'seq1':     ["1","2"],
'seq2':     ["3","4","2"],
'seq3':     ["5","4","2"],
'seq4':     ["6","7","4","2"],
'seq5':     ["6","4","7","2"],
'seq6':     ["6","1","8","9","10"],
'seq7':     ["6","1","8","11","9","12","13","14"],
'seq8':     ["6","1","8","11","4","15","13"],
'seq9':     ["6","1","8","16","9","11","4","17","18","2"],
'seq10':    ["6","1","8","19","9","4","16","2"],
}

我希望这些序列包含至少2个元素:

[1, 2], 
[4, 2], 
[6, 7], 
[6, 4, 7, 2], 
[6, 1, 8] 
[9,10], 
[6,1,8,11]
[9,12,13,14]
[4,15,13]
[16,9,11,4,17,18,2]
[19,9,4,16,2]

现在我写了这段代码:

precond = {

    'seq1':     ["1","2"],
    'seq2':     ["3","4","2"],
    'seq3':     ["5","4","2"],
    'seq4':     ["6","7","4","2"],
    'seq5':     ["6","4","7","2"],
    'seq6':     ["6","1","8","9","10"],
    'seq7':     ["6","1","8","11","9","12","13","14"],
    'seq8':     ["6","1","8","11","4","15","13"],
    'seq9':     ["6","1","8","16","9","11","4","17","18","2"],
    'seq10':    ["6","1","8","19","9","4","16","2"],
}

seq_list = []
result_seq = []
#d = []

for seq in precond.values():
    seq_list.append(seq)

#print(b)

contseq_ind = 0
control_seq = seq_list[contseq_ind]
mainseq_ind = 1
el_ind = 0
#index2 = 0

def compar():
    if control_seq[contseq_ind] != seq_list[mainseq_ind][el_ind]:
        mainseq_ind += 1
        compar()
    else:
        result_seq.append(control_seq[contseq_ind])
        contseq_ind += 1
        el_ind += 1

        if contseq_ind > len(control_seq):
            control_seq = seq_list[contseq_ind + 1]
            compar()
        else:
            compar()


compar()

这段代码无论如何都不完整 - 我从一开始就创建了相同的元素,所以我仍然需要在两个比较元素的末尾编写一个代码来搜索序列。

现在我有一个递归问题。在第一次递归通话后,我有这个错误:

if control_seq[contseq_ind] != b[mainseq_ind][el_ind]:
UnboundLocalError: local variable 'control_seq' referenced before assignment

我该如何解决这个问题?或者你可能比使用递归有更好的想法?提前谢谢。

1 个答案:

答案 0 :(得分:0)

不确定这是否是您想要的,但结果相同:

ngAfterViewChecked() { 
this.taskService.getTasks().subscribe(tasks => {
      this.tasks = tasks;
    });
}

结果:

from collections import OrderedDict

a = {'seq1':["5","4","3","2","1","6","7","8","9"],
     'seq2':["9","8","7","6","5","4","3","2","1"],
     'seq3':["5","4","3","2","1","11","12","13","14"],
     'seq4':["15","16","17"],
     'seq5':["18","19","20","21","22","23"],
     'seq6':["18","19","20","24","25","26"]}

level = 0
counts = OrderedDict()
# go through each value in the list of values to count the number
# of times it is used and indicate which list it belongs to
for elements in a.values():
    for element in elements:
        if element in counts:
            a,b = counts[element]
            counts[element] = a,b+1
        else:
            counts[element] = (level,1)
    level+=1

last = 0
result = []
# now break up the dictionary of unique values into lists according 
# to the count of each value and the level that they existed in 
for k,v in counts.items():
    if v == last:
        result[-1].append(k)
    else:
        result.append([k])
    last = v

print(result)