对于数组中的每个元素,返回不包含该元素的整个数组

时间:2019-12-19 22:46:40

标签: python arrays

我希望我的代码针对数组中的每个元素返回此数组,但不包含此一个元素。 示例:对于数组numbers=[1,2,3],我要输出"[2,3]","[1,3]","[1,2]"

我使用了以下代码:

examp = [1, 2, 3, 4, 5]

for number in examp:
  print(str(number) + " MAIN")
  subExp = examp
  subExp.remove(number)
  print(subExp)

但这是输出(单词“ MAIN”用作信息,该元素现在已从数组中“减去”):

1 MAIN
[2, 3, 4, 5]
3 MAIN
[2, 4, 5]
5 MAIN
[2, 4]

对于上面的这段代码,我希望这样:

1 MAIN
[2, 3, 4, 5]
2 MAIN
[1, 3, 4, 5]
3 MAIN
[1, 2, 4, 5]
4 MAIN
[1, 2, 3, 5]
5 MAIN
[1, 2, 3, 4]

这可能是我这方面的愚蠢错误,但是作为该主题的初学者,我在任何地方都找不到答案,因此,如果有更好的方法,请帮忙

4 个答案:

答案 0 :(得分:1)

问题是这一行:

subExp = examp

这里的subExp不是examp的副本,而是另一个examp指向列表[1, 2, 3, 4, 5]的指针。因此,在for循环的每次迭代中,您都会删除列表的一个条目。

您可以将该行替换为:

subExp = examp.copy()

将会复制examp的浅表副本。尽管这适用于平面列表,但您会遇到嵌套列表的麻烦。通常,您要使用copy软件包的

subExp = copy.deepcopy(examp)

编辑:如果您不需要打印行,那么itertools.combinations()是您的最佳选择。有关更多信息,请参见https://docs.python.org/2/library/itertools.html#itertools.combinations

答案 1 :(得分:1)

对于这些,您可以使用itertools:

import itertools
list(itertools.combinations([1, 2, 3,4,5],4))                                                                                                                                       
# [(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)]

答案 2 :(得分:0)

您可以创建一个范围,然后输出按索引过滤的数组

examp = [1, 2, 3, 4, 5]

for x in range(0, len(examp)):
    print(f'iteration {x + 1} ->')
    print([el for i, el in enumerate(examp) if i != x])

或使用itertools

print(list(itertools.combinations(examp, len(examp) - 1)))

答案 3 :(得分:0)

遍历列表,切出当前元素:

examp = [7, False, "OOpS", 3.14159]

for i in range(len(examp)):
    print(examp[:i] + examp[i+1:])

输出:

[False, 'OOpS', 3.14159]
[7, 'OOpS', 3.14159]
[7, False, 3.14159]
[7, False, 'OOpS']