当前位置: 代码迷 >> python >> 创建列表列表
  详细解决方案

创建列表列表

热度:52   发布时间:2023-06-27 21:54:44.0

我有看起来像的代码:

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)
[[], [], [], [], []]

不太确定我要去哪里错,因此感谢您的帮助。

当您将列表添加到主列表中时,实际上是在将指针添加到该原始列表。 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)

列表内容消失的实际问题已经在其他答案中得到解决,但是我想指出的是,您可以使代码更简单。

如果我正确地理解了代码(现在已经从问题中删除了),那么您正在寻找的球员组合构成了一支合法球队,其薪水在一定范围之内。 团队需要C组(队长?)一名球员,以及PGSGPFSF各组中的两名。

您可以为此使用模块,尤其是和 。

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)
  相关解决方案