Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表组合_Python_Itertools - Fatal编程技术网

Python列表组合

Python列表组合,python,itertools,Python,Itertools,我有一份清单: nums = [1, 2, 3, 4] 我想得到所有可能的方法来拆分列表1-3: 现在我能找到的最好的方法是使用itertools.combinationsnum,3,但它只给出每个项目的第二部分,即[1,2,3,1,2,4,1,3,4]。还有其他方法可以使用吗?你已经成功了一半。您可以使用和将结果与原始列表合并: 但是如果你想使用第一部分只是某种索引,那就没有必要了。显然,您可以使用元素在列表中的位置作为索引。您已经完成了一半。您可以使用和将结果与原始列表合并: 但是如果你想

我有一份清单:

nums = [1, 2, 3, 4]
我想得到所有可能的方法来拆分列表1-3:


现在我能找到的最好的方法是使用itertools.combinationsnum,3,但它只给出每个项目的第二部分,即[1,2,3,1,2,4,1,3,4]。还有其他方法可以使用吗?

你已经成功了一半。您可以使用和将结果与原始列表合并:


但是如果你想使用第一部分只是某种索引,那就没有必要了。显然,您可以使用元素在列表中的位置作为索引。

您已经完成了一半。您可以使用和将结果与原始列表合并:


但是如果你想使用第一部分只是某种索引,那就没有必要了。显然,您可以使用元素在列表中的位置作为索引。

这可以做到这一点,但可能效率低下:

>>> t=set(nums) ; [ (t.difference(x).pop(),x) for x in list(itertools.combinations(t,3)) ]
[(4, (1, 2, 3)), (3, (1, 2, 4)), (2, (1, 3, 4)), (1, (2, 3, 4))]

这样做确实有效,但可能效率低下:

>>> t=set(nums) ; [ (t.difference(x).pop(),x) for x in list(itertools.combinations(t,3)) ]
[(4, (1, 2, 3)), (3, (1, 2, 4)), (2, (1, 3, 4)), (1, (2, 3, 4))]

根据您要解决的问题的一般性,解决方案可能会或多或少地简单:

In [1]: nums = [1, 2, 3, 4]

In [2]: [(x, tuple(y for y in nums if y != x)) for x in nums]
Out[2]: [(1, (2, 3, 4)), (2, (1, 3, 4)), (3, (1, 2, 4)), (4, (1, 2, 3))]
如果列表中存在重复值,请使用索引进行比较:

In [3]: [(x, tuple(y for j, y in enumerate(nums) if j != i)) for i, x in enumerate(nums)]
Out[3]: [(1, (2, 3, 4)), (2, (1, 3, 4)), (3, (1, 2, 4)), (4, (1, 2, 3))]

根据您要解决的问题的一般性,解决方案可能会或多或少地简单:

In [1]: nums = [1, 2, 3, 4]

In [2]: [(x, tuple(y for y in nums if y != x)) for x in nums]
Out[2]: [(1, (2, 3, 4)), (2, (1, 3, 4)), (3, (1, 2, 4)), (4, (1, 2, 3))]
如果列表中存在重复值,请使用索引进行比较:

In [3]: [(x, tuple(y for j, y in enumerate(nums) if j != i)) for i, x in enumerate(nums)]
Out[3]: [(1, (2, 3, 4)), (2, (1, 3, 4)), (3, (1, 2, 4)), (4, (1, 2, 3))]

这似乎是一个更简单的解决方案:

nums = [1, 2, 3, 4]
for n in range(len(nums)):
    print (nums[n], nums[:n] + nums[n+1:])
作为理解:

result = [(s, nums[:n] + nums[n+1:]) for n, s in enumerate(nums)]

这似乎是一个更简单的解决方案:

nums = [1, 2, 3, 4]
for n in range(len(nums)):
    print (nums[n], nums[:n] + nums[n+1:])
作为理解:

result = [(s, nums[:n] + nums[n+1:]) for n, s in enumerate(nums)]

你说不需要订货是什么意思?看起来第一部分中的数字总是第二部分列表中没有的数字。对不对?要做到这一点,你必须将两个列表正确地结合起来。你说不需要顺序是什么意思?看起来第一部分中的数字总是第二部分列表中没有的数字。对不对?要实现这一点,您必须正确地组合两个列表。这是一种不错的方法,但如果NUM中存在重复的值,则该方法将不起作用。对于一个更通用的解决方案,使用enumerate并比较索引。@Shawn,这是我在说它可能更简单时想到的事情之一:我添加了一个enumerate示例,它看起来不太漂亮。可以简化吗?这是一个不错的方法,但如果NUM中有重复的值,它将不起作用。对于一个更通用的解决方案,使用enumerate并比较索引。@Shawn,这是我在说它可能更简单时想到的事情之一:我添加了一个enumerate示例,它看起来不太漂亮。它可以简化吗?内部集合是一个列表而不是元组,如OP的示例所示,但是如果它很重要的话,这是很容易修复的。很好的解决方案。@ShawnChin:是的,元组故意留给读者作为练习。内部集合是一个列表,而不是像OP的示例中所示的元组,但是如果它很重要的话,修复起来就很简单了。很好的解决方案。@ShawnChin:是的,元组是特意留给读者作为练习的