列表上的特定迭代方法

时间:2017-11-29 14:41:20

标签: python python-3.x

对于如下列表:

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

但不是我想要的。

很抱歉,如果这很简单,还是新手/获取此语言的语法和功能!

2 个答案:

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

(如果这是某种编程分配,这可能不是预期的输出,但在实践中可能会更容易处理。)