对于如下列表:
list1 = [1, 2, 3, 4]
迭代整数以获得返回的最佳方法是什么:
[1, (1,2), (1,2,3), (1,2,3,4), 2, (2, 3), (2,3,4) 3, (3,4), 4]
在没有重新排列数字的情况下获得所有组合。
我尝试过像
这样的想法def practice(list1):
list2 = []
for i in list1:
for j in list1:
list2.append((i, j))
return list2
返回
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (4, 1), (4, 2), (4, 3), (4, 4)]
但不是我想要的。
很抱歉,如果这很简单,还是新手/获取此语言的语法和功能!
答案 0 :(得分:3)
您可以使用这样的生成器生成列表中所有可能的连续切片,然后对单例进行区分:
def practice(list1):
for i in range(len(list1)): # start index of slice
for j in range(i, len(list1)): # end index [-1]
# differentiate singleton cases
yield list1[i] if i==j else tuple(list1[i:j+1])
list(practice([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 :(得分:3)
或者,您可以使用itertools
获取边界的combinations (with replacement),然后返回这些边界的生成器。另外,我建议不要返回混合列表,而是将单个数字包装成一个元素组。
import itertools
def practice(lst):
return (tuple(lst[i:j+1])
for i, j in itertools.combinations_with_replacement(range(len(lst)), 2))
print(list(practice([1, 2, 3, 4])))
# [(1,), (1, 2), (1, 2, 3), (1, 2, 3, 4), (2,), (2, 3), (2, 3, 4), (3,), (3, 4), (4,)]
或更短(感谢@schwobaseggl),仅使用combinations
而不替换range
。不确定两者中哪一个更清楚。
def practice(lst):
return (tuple(lst[i:j]) # <-- no +1 here +1 here --v
for i, j in itertools.combinations(range(len(lst)+1), 2))
(如果这是某种编程分配,这可能不是预期的输出,但在实践中可能会更容易处理。)