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]
答案 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)))