我的代码如下:
Loop that appends player names to a list called playerlist
print(playerlist)
lineuplist.append(playerlist)
print语句最终会打印一个如下所示的列表:
...
['Omer Asik', 'Jordan Farmar', 'Patrick Beverley', 'Kyle Korver', 'Kent Bazemore', 'Pau Gasol', 'Paul Millsap', 'Chandler Parsons', 'Kevin Durant']
['Omer Asik', 'Jordan Farmar', 'Patrick Beverley', 'Kyle Korver', 'Kent Bazemore', 'Serge Ibaka', 'Pau Gasol', 'Kevin Durant', 'Chandler Parsons']
['Omer Asik', 'Jordan Farmar', 'Patrick Beverley', 'Kyle Korver', 'Kent Bazemore', 'Serge Ibaka', 'Pau Gasol', 'Chandler Parsons', 'Kevin Durant']
['Omer Asik', 'Jordan Farmar', 'Patrick Beverley', 'Kyle Korver', 'Kent Bazemore', 'Paul Millsap', 'Pau Gasol', 'Kevin Durant', 'Chandler Parsons']
...
我希望我的输出是这些列表的列表,即:
[['Omer Asik', 'Jordan Farmar', 'Patrick Beverley', 'Kyle Korver', 'Kent Bazemore', 'Pau Gasol', 'Paul Millsap', 'Chandler Parsons', 'Kevin Durant'], ['Omer Asik', 'Jordan Farmar', 'Patrick Beverley', 'Kyle Korver', 'Kent Bazemore', 'Serge Ibaka', 'Pau Gasol', 'Kevin Durant', 'Chandler Parsons'], ['Omer Asik', 'Jordan Farmar', 'Patrick Beverley', 'Kyle Korver', 'Kent Bazemore', 'Serge Ibaka', 'Pau Gasol', 'Chandler Parsons', 'Kevin Durant'], ['Omer Asik', 'Jordan Farmar', 'Patrick Beverley', 'Kyle Korver', 'Kent Bazemore', 'Paul Millsap', 'Pau Gasol', 'Kevin Durant', 'Chandler Parsons']]
然而,我得到的只是:
print(lineuplist)
[[], [], [], [], []]
不确定我哪里出错了,所以感谢任何帮助。
答案 0 :(得分:3)
当您将列表追加到主列表中时,实际上是在追加指向该原始列表的指针。 Python列表是可变的,当你更改它们时,你可以在有指向它们的地方改变它们。
如果你追加它们的副本,你可以避免这是一个问题,但你会浪费记忆,所以有充分的理由去复制它们很重要。
以下是此行为的示例:
>>> l = list('abc')
>>> m = [l.copy()]
>>> m
[['a', 'b', 'c']]
>>> l.remove('a')
>>> m
[['a', 'b', 'c']]
>>> l
['b', 'c']
所以你能做的就是:
lineuplist.append(playerlist.copy())
而不是:
lineuplist.append(playerlist)
答案 1 :(得分:1)
列表内容消失的实际问题已在另一个答案中得到解决,但我想要注意的是,您可以使代码更加简单。
如果我正确理解了代码(现已从问题中删除),那么您正在寻找一个组合的球员组合,这些球员的组合薪水在一定范围内。团队需要C
组中的一名玩家(队长?),以及来自PG
,SG
,PF
和SF
组的每名玩家2名玩家。
您可以使用itertools
模块,尤其是product
和combinations
。
from itertools import product, combinations
player_combinations = product(combinations(C, 1),
combinations(PG, 2),
combinations(SG, 2),
combinations(PF, 2),
combinations(SF, 2))
(更新:这将返回嵌套元组列表,因此您需要先将其展平。您可以使用sum
来实现此目的。)
player_combinations = (sum(pc, ()) for pc in player_combinations)
结果是一个迭代器,包含所有玩家组合(整个对象,而不仅仅是名称)。现在,您可以在一个循环中找到满足薪资标准的团队并提取其名称:
lineuplist = []
for players in player_combinations:
salary = sum(player[5] for player in players)
if salarycap - undersalary <= salary <= salarycap:
names = [player[1] for player in players]
lineuplist.append(names)