将列表相乘
Multiplying lists together
一直在做一个小的 class 项目来制作二十一点游戏。我意识到在这方面有十亿种方法,但我正在尝试理解编码并构建自己的……话虽这么说,但我搞砸了很多。虽然这个难题让我感到困惑......在设置我的套牌时,我试过这个:
suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
decks = []
for suit in suits:
for rank in ranks:
decks += (rank, suit)
print decks
我得到了两个列表一起排序的预期结果:
['ace', 'spades', 'two', 'spades', 'three', 'spades', 'four'...]
但是,当我尝试将它们组合成字典时,如下所示:
b = dict(zip(decks[1::2], decks[0::2]))
print b
我得到:{'hearts':'King','clubs':'King','spades':'King','diamonds' : 'King'} 为什么它只做国王值?
当我尝试使用以下代码进行纠正时:
spade = ['spades']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
spades = []
for rank in ranks:
spades += (rank, spade)
print spades
我得到这个作为输出:
['ace', ['spades'], 'two', ['spades'], 'three', ['spades'],...]
那么是什么原因呢?帮助菜鸟!我的意图是通过列表稍微优雅地创建一个套牌,将值附加到卡片,创建一个字典并使用这些值来计算分数......并试图更好地理解 Python 编码!
谢谢!
您可以使用列表组合来创建一副纸牌,例如 [[rank,suits]]
。 dict()
仅从 2 个值 [value1,value2]
创建了一个对象。你不断得到 {'hearts': 'King', 'clubs': 'King', 'spades': 'King', 'diamonds': 'King'}
的原因是因为字典有唯一的 {key:value}
对,最后要分配这些键的项目是 ranks
数组中的 King
。
suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven',
'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
print [(rank, suit) for suit in suits for rank in ranks]
解决方案
您可以将 ranks
的键和 (rank,suit)
的值设为具有相同 rank
的数组
card_dict = {}
suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven',
'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
deck = [(rank, suit) for suit in suits for rank in ranks]
map(
lambda rank: card_dict.update(
{
rank: filter(lambda card: rank in card, deck)
}
), ranks
)
print card_dict
结果
{
'King': [('King', 'spades'), ('King', 'hearts'), ('King', 'clubs'), ('King', 'diamonds')],
'seven': [('seven', 'spades'), ('seven', 'hearts'), ('seven', 'clubs'), ('seven', 'diamonds')],
'Queen': [('Queen', 'spades'), ('Queen', 'hearts'), ('Queen', 'clubs'), ('Queen', 'diamonds')],
'ace': [('ace', 'spades'), ('ace', 'hearts'), ('ace', 'clubs'), ('ace', 'diamonds')],
'ten': [('ten', 'spades'), ('ten', 'hearts'), ('ten', 'clubs'), ('ten', 'diamonds')],
'nine': [('nine', 'spades'), ('nine', 'hearts'), ('nine', 'clubs'), ('nine', 'diamonds')],
'six': [('six', 'spades'), ('six', 'hearts'), ('six', 'clubs'), ('six', 'diamonds')],
'two': [('two', 'spades'), ('two', 'hearts'), ('two', 'clubs'), ('two', 'diamonds')],
'three': [('three', 'spades'), ('three', 'hearts'), ('three', 'clubs'), ('three', 'diamonds')],
'four': [('four', 'spades'), ('four', 'hearts'), ('four', 'clubs'), ('four', 'diamonds')],
'five': [('five', 'spades'), ('five', 'hearts'), ('five', 'clubs'), ('five', 'diamonds')],
'Jack': [('Jack', 'spades'), ('Jack', 'hearts'), ('Jack', 'clubs'), ('Jack', 'diamonds')],
'eight': [('eight', 'spades'), ('eight', 'hearts'), ('eight', 'clubs'), ('eight', 'diamonds')]
}
或者如果您按 suits
而不是 ranks
映射
{
'clubs': [('ace', 'clubs'),
('two', 'clubs'),
('three', 'clubs'),
('four', 'clubs'),
('five', 'clubs'),
('six', 'clubs'),
('seven', 'clubs'),
('eight', 'clubs'),
('nine', 'clubs'),
('ten', 'clubs'),
('Jack', 'clubs'),
('Queen', 'clubs'),
('King', 'clubs')
],
'diamonds': [('ace', 'diamonds'),
('two', 'diamonds'),
('three', 'diamonds'),
('four', 'diamonds'),
('five', 'diamonds'),
('six', 'diamonds'),
('seven', 'diamonds'),
('eight', 'diamonds'),
('nine', 'diamonds'),
('ten', 'diamonds'),
('Jack', 'diamonds'),
('Queen', 'diamonds'),
('King', 'diamonds')
],
'hearts': [('ace', 'hearts'),
('two', 'hearts'),
('three', 'hearts'),
('four', 'hearts'),
('five', 'hearts'),
('six', 'hearts'),
('seven', 'hearts'),
('eight', 'hearts'),
('nine', 'hearts'),
('ten', 'hearts'),
('Jack', 'hearts'),
('Queen', 'hearts'),
('King', 'hearts')
],
'spades': [('ace', 'spades'),
('two', 'spades'),
('three', 'spades'),
('four', 'spades'),
('five', 'spades'),
('six', 'spades'),
('seven', 'spades'),
('eight', 'spades'),
('nine', 'spades'),
('ten', 'spades'),
('Jack', 'spades'),
('Queen', 'spades'),
('King', 'spades')
]
}
洗牌
import random
random.shuffle(deck)
print deck
谈论乘法列表应该迫使您使用 itertools.product
,并通过转换为 list
强制迭代
import itertools
suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
decks = list(itertools.product(suits,ranks))
print(decks)
结果
[('spades', 'ace'), ('spades', 'two'), ('spades', 'three'), ('spades', 'four'), ('spades', 'five'), ('spades', 'six'), ('spades', 'seven'), ('spades', 'eight'), ('spades', 'nine'), ('spades', 'ten'), ('spades', 'Jack'), ('spades', 'Queen'), ('spades', 'King'), ('hearts', 'ace'), ('hearts', 'two'), ('hearts', 'three'), ('hearts', 'four'), ('hearts', 'five'), ('hearts', 'six'), ('hearts', 'seven'), ('hearts', 'eight'), ('hearts', 'nine'), ('hearts', 'ten'), ('hearts', 'Jack'), ('hearts', 'Queen'), ('hearts', 'King'), ('clubs', 'ace'), ('clubs', 'two'), ('clubs', 'three'), ('clubs', 'four'), ('clubs', 'five'), ('clubs', 'six'), ('clubs', 'seven'), ('clubs', 'eight'), ('clubs', 'nine'), ('clubs', 'ten'), ('clubs', 'Jack'), ('clubs', 'Queen'), ('clubs', 'King'), ('diamonds', 'ace'), ('diamonds', 'two'), ('diamonds', 'three'), ('diamonds', 'four'), ('diamonds', 'five'), ('diamonds', 'six'), ('diamonds', 'seven'), ('diamonds', 'eight'), ('diamonds', 'nine'), ('diamonds', 'ten'), ('diamonds', 'Jack'), ('diamonds', 'Queen'), ('diamonds', 'King')]
或者由于您似乎需要一个平面列表,只需使用 chain.from_iterable
:
将其展平即可
decks = list(itertools.chain.from_iterable(itertools.product(suits,ranks)))
一直在做一个小的 class 项目来制作二十一点游戏。我意识到在这方面有十亿种方法,但我正在尝试理解编码并构建自己的……话虽这么说,但我搞砸了很多。虽然这个难题让我感到困惑......在设置我的套牌时,我试过这个:
suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
decks = []
for suit in suits:
for rank in ranks:
decks += (rank, suit)
print decks
我得到了两个列表一起排序的预期结果: ['ace', 'spades', 'two', 'spades', 'three', 'spades', 'four'...]
但是,当我尝试将它们组合成字典时,如下所示:
b = dict(zip(decks[1::2], decks[0::2]))
print b
我得到:{'hearts':'King','clubs':'King','spades':'King','diamonds' : 'King'} 为什么它只做国王值?
当我尝试使用以下代码进行纠正时:
spade = ['spades']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
spades = []
for rank in ranks:
spades += (rank, spade)
print spades
我得到这个作为输出: ['ace', ['spades'], 'two', ['spades'], 'three', ['spades'],...]
那么是什么原因呢?帮助菜鸟!我的意图是通过列表稍微优雅地创建一个套牌,将值附加到卡片,创建一个字典并使用这些值来计算分数......并试图更好地理解 Python 编码!
谢谢!
您可以使用列表组合来创建一副纸牌,例如 [[rank,suits]]
。 dict()
仅从 2 个值 [value1,value2]
创建了一个对象。你不断得到 {'hearts': 'King', 'clubs': 'King', 'spades': 'King', 'diamonds': 'King'}
的原因是因为字典有唯一的 {key:value}
对,最后要分配这些键的项目是 ranks
数组中的 King
。
suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven',
'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
print [(rank, suit) for suit in suits for rank in ranks]
解决方案
您可以将 ranks
的键和 (rank,suit)
的值设为具有相同 rank
card_dict = {}
suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven',
'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
deck = [(rank, suit) for suit in suits for rank in ranks]
map(
lambda rank: card_dict.update(
{
rank: filter(lambda card: rank in card, deck)
}
), ranks
)
print card_dict
结果
{
'King': [('King', 'spades'), ('King', 'hearts'), ('King', 'clubs'), ('King', 'diamonds')],
'seven': [('seven', 'spades'), ('seven', 'hearts'), ('seven', 'clubs'), ('seven', 'diamonds')],
'Queen': [('Queen', 'spades'), ('Queen', 'hearts'), ('Queen', 'clubs'), ('Queen', 'diamonds')],
'ace': [('ace', 'spades'), ('ace', 'hearts'), ('ace', 'clubs'), ('ace', 'diamonds')],
'ten': [('ten', 'spades'), ('ten', 'hearts'), ('ten', 'clubs'), ('ten', 'diamonds')],
'nine': [('nine', 'spades'), ('nine', 'hearts'), ('nine', 'clubs'), ('nine', 'diamonds')],
'six': [('six', 'spades'), ('six', 'hearts'), ('six', 'clubs'), ('six', 'diamonds')],
'two': [('two', 'spades'), ('two', 'hearts'), ('two', 'clubs'), ('two', 'diamonds')],
'three': [('three', 'spades'), ('three', 'hearts'), ('three', 'clubs'), ('three', 'diamonds')],
'four': [('four', 'spades'), ('four', 'hearts'), ('four', 'clubs'), ('four', 'diamonds')],
'five': [('five', 'spades'), ('five', 'hearts'), ('five', 'clubs'), ('five', 'diamonds')],
'Jack': [('Jack', 'spades'), ('Jack', 'hearts'), ('Jack', 'clubs'), ('Jack', 'diamonds')],
'eight': [('eight', 'spades'), ('eight', 'hearts'), ('eight', 'clubs'), ('eight', 'diamonds')]
}
或者如果您按 suits
而不是 ranks
{
'clubs': [('ace', 'clubs'),
('two', 'clubs'),
('three', 'clubs'),
('four', 'clubs'),
('five', 'clubs'),
('six', 'clubs'),
('seven', 'clubs'),
('eight', 'clubs'),
('nine', 'clubs'),
('ten', 'clubs'),
('Jack', 'clubs'),
('Queen', 'clubs'),
('King', 'clubs')
],
'diamonds': [('ace', 'diamonds'),
('two', 'diamonds'),
('three', 'diamonds'),
('four', 'diamonds'),
('five', 'diamonds'),
('six', 'diamonds'),
('seven', 'diamonds'),
('eight', 'diamonds'),
('nine', 'diamonds'),
('ten', 'diamonds'),
('Jack', 'diamonds'),
('Queen', 'diamonds'),
('King', 'diamonds')
],
'hearts': [('ace', 'hearts'),
('two', 'hearts'),
('three', 'hearts'),
('four', 'hearts'),
('five', 'hearts'),
('six', 'hearts'),
('seven', 'hearts'),
('eight', 'hearts'),
('nine', 'hearts'),
('ten', 'hearts'),
('Jack', 'hearts'),
('Queen', 'hearts'),
('King', 'hearts')
],
'spades': [('ace', 'spades'),
('two', 'spades'),
('three', 'spades'),
('four', 'spades'),
('five', 'spades'),
('six', 'spades'),
('seven', 'spades'),
('eight', 'spades'),
('nine', 'spades'),
('ten', 'spades'),
('Jack', 'spades'),
('Queen', 'spades'),
('King', 'spades')
]
}
洗牌
import random
random.shuffle(deck)
print deck
谈论乘法列表应该迫使您使用 itertools.product
,并通过转换为 list
import itertools
suits = ['spades', 'hearts', 'clubs', 'diamonds']
ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Queen', 'King']
decks = list(itertools.product(suits,ranks))
print(decks)
结果
[('spades', 'ace'), ('spades', 'two'), ('spades', 'three'), ('spades', 'four'), ('spades', 'five'), ('spades', 'six'), ('spades', 'seven'), ('spades', 'eight'), ('spades', 'nine'), ('spades', 'ten'), ('spades', 'Jack'), ('spades', 'Queen'), ('spades', 'King'), ('hearts', 'ace'), ('hearts', 'two'), ('hearts', 'three'), ('hearts', 'four'), ('hearts', 'five'), ('hearts', 'six'), ('hearts', 'seven'), ('hearts', 'eight'), ('hearts', 'nine'), ('hearts', 'ten'), ('hearts', 'Jack'), ('hearts', 'Queen'), ('hearts', 'King'), ('clubs', 'ace'), ('clubs', 'two'), ('clubs', 'three'), ('clubs', 'four'), ('clubs', 'five'), ('clubs', 'six'), ('clubs', 'seven'), ('clubs', 'eight'), ('clubs', 'nine'), ('clubs', 'ten'), ('clubs', 'Jack'), ('clubs', 'Queen'), ('clubs', 'King'), ('diamonds', 'ace'), ('diamonds', 'two'), ('diamonds', 'three'), ('diamonds', 'four'), ('diamonds', 'five'), ('diamonds', 'six'), ('diamonds', 'seven'), ('diamonds', 'eight'), ('diamonds', 'nine'), ('diamonds', 'ten'), ('diamonds', 'Jack'), ('diamonds', 'Queen'), ('diamonds', 'King')]
或者由于您似乎需要一个平面列表,只需使用 chain.from_iterable
:
decks = list(itertools.chain.from_iterable(itertools.product(suits,ranks)))