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)
toself.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)
toself.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。此外,请确保您可以以不同的方式回答任何问题。你可以选择使用任何你想用的方法,你可以很容易理解。