我希望我的代码针对数组中的每个元素返回此数组,但不包含此一个元素。
示例:对于数组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]
这可能是我这方面的愚蠢错误,但是作为该主题的初学者,我在任何地方都找不到答案,因此,如果有更好的方法,请帮忙
答案 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']