从python中的连续列表中识别连续数字组

时间:2016-05-02 06:45:12

标签: python algorithm list range continuous

python中从n个连续列表中选取多个n个连续整数的最有效方法是什么,从每个列表中选取一个整数。这里的n非常大......大约100秒。

L1 = [5,3,2,7,1]
L2 = [3,5,6,8,9,21,2]
L3 = [5,3,6,7,3,9]

我想从连续列表中打印出连续整数的范围,其中第一个元素从第一个列表中获取,第二个元素从第二个列表中获取,依此类推:

Candidate solution [5,6,7], [1,2,3], [7,8,9]

4 个答案:

答案 0 :(得分:1)

我首先尝试使用有效的排序算法对列表进行排序。您可以尝试Bubble Sort,但其他排序算法也可以使用。

然后,您可以运行1-n中的整数,并在字符串中查找连续的整数范围。这样,对于“查找”的排序和n操作,最多有n²次操作。

这对你来说足够快吗?

答案 1 :(得分:1)

L1 = [5,3,2,7,1]
L2 = [3,5,6,8,9,21,2]
L3 = [5,3,6,7,3,9]
cons_l = []
L = [L2] + [L3] #+[L4] #+ ...+ ..... ### Add any number of list here..

j = 0
for l1 in L1:
   cons_l.append([])
   cons_l[j].append(l1)
   for l in range(0, len(L)):
      if l1+l+1 in L[l]:
         cons_l[j].append(l1+l+1)
      else:
         del cons_l[j]
         j -= 1
         break
   j += 1
print cons_l

答案 2 :(得分:0)

使用套装可能会对您的应用程序足够快吗?有点暴力 - 但如果我理解正确,它符合你的限制:

lists = [
  [5,3,2,7,1],
  [3,5,6,8,9,21,2],
  [5,3,6,7,3,9],
]

candidates = list()

# Without the first one
rest_of_sets = [set(l) for l in lists[1:]]

for fe in lists[0]:
    skip_partial = False
    for i, s in enumerate(rest_of_sets, 1):
        if fe + i not in s:
            skip_partial = True
            break
    if not skip_partial:
        candidates.append(range(fe, fe+len(sets)))

print candidates

答案 3 :(得分:0)

您可以使用列表推导

In [23]: ls = [[5,3,2,7,1],[3,5,6,8,9,21,2],[5,3,6,7,3,9],]

In [24]: l = len(ls)

In [25]: [list(range(s,s+l)) for s in ls[0] if all(i in l for i,l in zip(range(s+1,s+l),ls[1:]))]
Out[25]: [[5, 6, 7], [7, 8, 9], [1, 2, 3]]

它的阵风是,对于第一个列表中的每个数字生成一系列递增的数字,并检查每个数字是否包含在剩余列表序列中的相应列表中。

请注意,只要不满足条件,all就会停止迭代生成器表达式,从而提高了方法的效率。

对于问题的大型实例,可能值得在列表理解之前将所有列表转换为集合ls = [set(l) for l in ls]

附录

使用for循环和条件语句的没有列表理解的变体,请注意在搜索序列之前内部列表已转换为集合。

ls = [[5, 3, 2, 7, 1], [3, 5, 6, 8, 9, 21, 2], [5, 3, 6, 7, 3, 9]]
l = len(ls)
ls = [set(li) for li in ls]

candidates = []
for n in ls[0]:
    if all(i in l for i, l in zip(range(n+1, n+l), ls[1:])):
        candidates.append(list(range(n, n+l)))