问题描述
我有看起来像的代码:
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)
[[], [], [], [], []]
不太确定我要去哪里错,因此感谢您的帮助。
1楼
当您将列表添加到主列表中时,实际上是在将指针添加到该原始列表。 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)
2楼
列表内容消失的实际问题已经在其他答案中得到解决,但是我想指出的是,您可以使代码更简单。
如果我正确地理解了代码(现在已经从问题中删除了),那么您正在寻找的球员组合构成了一支合法球队,其薪水在一定范围之内。
团队需要C
组(队长?)一名球员,以及PG
, SG
, PF
和SF
各组中的两名。
您可以为此使用模块,尤其是和 。
from itertools import product, combinations
player_combinations = product(combinations(C, 1),
combinations(PG, 2),
combinations(SG, 2),
combinations(PF, 2),
combinations(SF, 2))
( 更新:这将返回嵌套的元组列表,因此您需要先对其进行展平。可以为此使用 。)
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)