Python嵌套列表创建

Python嵌套列表创建,python,python-3.x,Python,Python 3.x,此代码的一个示例结果是 import random class player(): def __init__(self, deck): self.deck = deck self.hand = [] self.results = [] def draw(self,draws): for counter in range(0, draws, 1): card = random.randra

此代码的一个示例结果是

import random

class player():
    def __init__(self, deck):
        self.deck = deck 
        self.hand = []
        self.results = []

    def draw(self,draws):
        for counter in range(0, draws, 1):
            card = random.randrange(0, len(self.deck), 1)
            self.hand.append(self.deck[card])
            del self.deck[card]

    def return_hand(self):
        for returncounter in range(0, len(self.hand), 1):
            self.deck.append(self.hand[returncounter]) 
        for returncounter in range(0, len(self.hand), 1):
            del self.hand[0]

    def simple_function(self):
        for counter in range(0, 3, 1):
            print("Loop", counter)
            self.draw(3)
            print("Hand", simple_cards.hand)
            self.results.extend(self.hand)
            print("Results before return", simple_cards.results)
            self.return_hand()
            print("Results after return", simple_cards.results)
            print("")

simple_cards = player(["A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3"])

simple_cards.simple_function()
print("Results after function", simple_cards.results)
如何生成结果3嵌套列表,如['B3',B2',C3'],['C2',B3',A1'],['C2',B2',C1']]

我觉得这里有一件非常基本的事情我不理解,这个问题肯定已经得到了回答,但我不知道如何更好地构建这个问题,通过搜索自己来找到它

我尝试了append(self.hand)和extend([self.hand]),但两者都产生了比它们所解决的问题更多的问题,导致了

Loop 0
Hand ['B3', 'B2', 'C3']
Results before return ['B3', 'B2', 'C3']
Results after return ['B3', 'B2', 'C3']

Loop 1
Hand ['C2', 'B3', 'A1']
Results before return ['B3', 'B2', 'C3', 'C2', 'B3', 'A1']
Results after return ['B3', 'B2', 'C3', 'C2', 'B3', 'A1']

Loop 2
Hand ['C2', 'B2', 'C1']
Results before return ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1']
Results after return ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1']

Results after function ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1']

谢谢您的帮助。

您可以使用
append
hand
副本添加到
结果中。仅添加
指针
的问题在于,您稍后将使用
del
对其进行修改,这将反映到打印结果中,如您的示例所示

如果将
self.results.extend(self.hand)
更改为
self.results.append(self.hand[:])
您将获得以下输出:

Loop 0
Hand ['B3', 'A2', 'B2']
Results before return [['B3', 'A2', 'B2']]
Results after return [[]]

Loop 1
Hand ['B2', 'B3', 'C3']
Results before return [['B2', 'B3', 'C3'], ['B2', 'B3', 'C3']]
Results after return [[], []]

Loop 2
Hand ['C2', 'B3', 'A2']
Results before return [['C2', 'B3', 'A2'], ['C2', 'B3', 'A2'], ['C2', 'B3', 'A2']]
Results after return [[], [], []]

Results after function [[], [], []]

您可以使用
append
hand
副本添加到
结果中。仅添加
指针
的问题在于,您稍后将使用
del
对其进行修改,这将反映到打印结果中,如您的示例所示

如果将
self.results.extend(self.hand)
更改为
self.results.append(self.hand[:])
您将获得以下输出:

Loop 0
Hand ['B3', 'A2', 'B2']
Results before return [['B3', 'A2', 'B2']]
Results after return [[]]

Loop 1
Hand ['B2', 'B3', 'C3']
Results before return [['B2', 'B3', 'C3'], ['B2', 'B3', 'C3']]
Results after return [[], []]

Loop 2
Hand ['C2', 'B3', 'A2']
Results before return [['C2', 'B3', 'A2'], ['C2', 'B3', 'A2'], ['C2', 'B3', 'A2']]
Results after return [[], [], []]

Results after function [[], [], []]

您还可以像现在一样保留代码,并且只分割结果

例如,我假设您的输出是:

Loop 0
Hand ['A1', 'C2', 'B3']
Results before return [['A1', 'C2', 'B3']]
Results after return [['A1', 'C2', 'B3']]

Loop 1
Hand ['B1', 'B3', 'A1']
Results before return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1']]
Results after return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1']]

Loop 2
Hand ['C2', 'B1', 'C1']
Results before return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']]
Results after return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']]

Results after function [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']]
所以,你可以这样做:

output = ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1']
输出:

expected_output = [output[i:i+3] for i in range(0, len(output), 3)]
print(expected_output)
因此,要编辑代码,您只需编辑一行:

self.results.extend(self.hand)
to
self.results.extend(self.hand[i:i+3]用于范围内的i(0,len(self.hand),3))

因此,您的
简单函数()
将是:

[['B3', 'B2', 'C3'], ['C2', 'B3', 'A1'], ['C2', 'B2', 'C1']]
编辑后的输出:

def simple_function(self):
        for counter in range(0, 3, 1):
            print("Loop", counter)
            self.draw(3)
            print("Hand", simple_cards.hand)
            # The edited line
            self.results.extend(self.hand[i:i+3] for i in range(0, len(self.hand), 3))
            print("Results before return", simple_cards.results)
            self.return_hand()
            print("Results after return", simple_cards.results)
            print("")

您还可以像现在一样保留代码,并且只分割结果

例如,我假设您的输出是:

Loop 0
Hand ['A1', 'C2', 'B3']
Results before return [['A1', 'C2', 'B3']]
Results after return [['A1', 'C2', 'B3']]

Loop 1
Hand ['B1', 'B3', 'A1']
Results before return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1']]
Results after return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1']]

Loop 2
Hand ['C2', 'B1', 'C1']
Results before return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']]
Results after return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']]

Results after function [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']]
所以,你可以这样做:

output = ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1']
输出:

expected_output = [output[i:i+3] for i in range(0, len(output), 3)]
print(expected_output)
因此,要编辑代码,您只需编辑一行:

self.results.extend(self.hand)
to
self.results.extend(self.hand[i:i+3]用于范围内的i(0,len(self.hand),3))

因此,您的
简单函数()
将是:

[['B3', 'B2', 'C3'], ['C2', 'B3', 'A1'], ['C2', 'B2', 'C1']]
编辑后的输出:

def simple_function(self):
        for counter in range(0, 3, 1):
            print("Loop", counter)
            self.draw(3)
            print("Hand", simple_cards.hand)
            # The edited line
            self.results.extend(self.hand[i:i+3] for i in range(0, len(self.hand), 3))
            print("Results before return", simple_cards.results)
            self.return_hand()
            print("Results after return", simple_cards.results)
            print("")

谢谢,这正是我想要的解决方案:)。当我指出另一个变量而不是创建一个全新的值时,python文档/教程中是否有任何特定的部分可以帮助我弄清楚?我想我通过反复试验学到了太多东西,因为我只部分理解python文档中使用的术语,所以阅读它并不能让事情变得像它应该说的那样清楚。@Diofsi您可以检查文档中使用的各种术语。您可以尝试从Python参考中阅读关于不可变对象和可变对象的解释。简言之,在调用方法时,您可以随时参考文档,查看它是否改变了对象。谢谢,这正是我所寻找的解决方案:)。当我指出另一个变量而不是创建一个全新的值时,python文档/教程中是否有任何特定的部分可以帮助我弄清楚?我想我通过反复试验学到了太多东西,因为我只部分理解python文档中使用的术语,所以阅读它并不能让事情变得像它应该说的那样清楚。@Diofsi您可以检查文档中使用的各种术语。您可以尝试从Python参考中阅读关于不可变对象和可变对象的解释。简言之,在调用方法时,您始终可以参考文档,查看它是否会改变对象。谢谢:)。代码行本身似乎比niemmis示例更复杂,但它允许对结果进行更复杂的切片,这在我不需要完整的自我时非常有用。是的,您可以在喜欢的步骤中拆分列表。因此,您可以按如下方式对其进行nstand
[output[i:i+step]for i in range(0,len(output),step)]
这行的意思是:对于0到输出长度之间的每一个i,返回一个从范围i到step的输出片段列表,但带有一个步长。例如,对于范围(0,7,3)内的k,k将是:0,3和6。此外,请确保您可以以不同的方式回答任何问题。您可以选择使用任何易于理解的方法。谢谢:)。代码行本身似乎比niemmis示例更复杂,但它允许对结果进行更复杂的切片,这在我不需要完整的自我时非常有用。是的,您可以在喜欢的步骤中拆分列表。因此,您可以按如下方式对其进行nstand
[output[i:i+step]for i in range(0,len(output),step)]
这行的意思是:对于0到输出长度之间的每一个i,返回一个从范围i到step的输出片段列表,但带有一个步长。例如,对于范围(0,7,3)内的k,k将是:0,3和6。此外,请确保您可以以不同的方式回答任何问题。你可以选择使用任何你想用的方法,你可以很容易理解。