如何从给定的一组数字中获取所有连续的数字序列?
How to get all consecutive sequences of numbers from given set of numbers?
我会以例子开始描述问题,这样问题就清楚了。
号码列表:[1,2,3,4]
如何获取每个连续的字符串:[[1],[1,2],[1,2,3],[1,2,3,4],[2] ,[2,3],[2,3,4],[3],[3,4],[4]]
我已经尝试解决这个问题一段时间了,并设法得到 [[1, 2, 3, 4], [2, 3, 4], [3, 4] , [4]] 有很多无用的重复。
list = [1,2,3,4]
i = 0
j = 0
tempList = []
sequancesList = []
while i < len(list):
while j < len(list):
tempList.append(list[j])
sequancesList.append(tempList)
j += 1
i += 1
j = i
tempList = []
def deleteDuplicates(list):
noduplist = []
for element in list:
if element not in noduplist:
noduplist.append(element)
return noduplist
finalSequancesList = deleteDuplicates(sequancesList)
print(finalSequancesList)
操作方法如下:
list = [1,2,3,4]
sequancesList = []
for i in range(len(list)):
tmp = []
for j in range(i,len(list)):
tmp.append(list[j])
sequancesList.append(tmp[:])
print(sequancesList)
-> [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
编辑:如评论中所述,以下方法仅在列表包含完整的升序数字时才有效,而在其他情况下则无效。
有两种方法可以做到这一点,作为嵌套 for-loop 或使用 list-comprehension 的 one-liner。以下两个版本:
嵌套for-loop
nrs = list(range(1,5))
result = []
for i in nrs:
for j in range(i, max(nrs)+1):
result.append(list(range(i,j+1)))
print(result)
List-comprehension
result = [list(range(i,j+1)) for i in nrs for j in range(i, max(nrs)+1)]
print(result)
这是一个完全可以做到这一点的生成器:
def iter_successive(input_list):
for i in range(len(input_list)):
for j in range(i+1,len(input_list)+1):
yield input_list[i:j]
>>> list(iter_successive(input_list))
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
可比较的one-liner解决方案:
def iter_successive(input_list):
return (input_list[i:j] for i in range(len(input_list))
for j in range(i+1,len(input_list)+1))
我会以例子开始描述问题,这样问题就清楚了。
号码列表:[1,2,3,4]
如何获取每个连续的字符串:[[1],[1,2],[1,2,3],[1,2,3,4],[2] ,[2,3],[2,3,4],[3],[3,4],[4]]
我已经尝试解决这个问题一段时间了,并设法得到 [[1, 2, 3, 4], [2, 3, 4], [3, 4] , [4]] 有很多无用的重复。
list = [1,2,3,4]
i = 0
j = 0
tempList = []
sequancesList = []
while i < len(list):
while j < len(list):
tempList.append(list[j])
sequancesList.append(tempList)
j += 1
i += 1
j = i
tempList = []
def deleteDuplicates(list):
noduplist = []
for element in list:
if element not in noduplist:
noduplist.append(element)
return noduplist
finalSequancesList = deleteDuplicates(sequancesList)
print(finalSequancesList)
操作方法如下:
list = [1,2,3,4]
sequancesList = []
for i in range(len(list)):
tmp = []
for j in range(i,len(list)):
tmp.append(list[j])
sequancesList.append(tmp[:])
print(sequancesList)
-> [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
编辑:如评论中所述,以下方法仅在列表包含完整的升序数字时才有效,而在其他情况下则无效。
有两种方法可以做到这一点,作为嵌套 for-loop 或使用 list-comprehension 的 one-liner。以下两个版本:
嵌套for-loop
nrs = list(range(1,5))
result = []
for i in nrs:
for j in range(i, max(nrs)+1):
result.append(list(range(i,j+1)))
print(result)
List-comprehension
result = [list(range(i,j+1)) for i in nrs for j in range(i, max(nrs)+1)]
print(result)
这是一个完全可以做到这一点的生成器:
def iter_successive(input_list):
for i in range(len(input_list)):
for j in range(i+1,len(input_list)+1):
yield input_list[i:j]
>>> list(iter_successive(input_list))
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [2], [2, 3], [2, 3, 4], [3], [3, 4], [4]]
可比较的one-liner解决方案:
def iter_successive(input_list):
return (input_list[i:j] for i in range(len(input_list))
for j in range(i+1,len(input_list)+1))