List 将列表相乘

List 将列表相乘,list,dictionary,python-2.6,List,Dictionary,Python 2.6,我一直在做一个小班项目来制作21点游戏。我意识到在这个问题上有10亿个方法,但我正在努力理解编码并构建自己的…尽管如此,我已经搞砸了很多。这个难题让我困惑……在搭建我的甲板时,我尝试了以下方法: suits = ['spades', 'hearts', 'clubs', 'diamonds'] ranks = ['ace', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'Jack', 'Q

我一直在做一个小班项目来制作21点游戏。我意识到在这个问题上有10亿个方法,但我正在努力理解编码并构建自己的…尽管如此,我已经搞砸了很多。这个难题让我困惑……在搭建我的甲板时,我尝试了以下方法:

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
我得到了两个列表一起排序的预期结果: [“A”、“黑桃”、“二”、“黑桃”、“三”、“黑桃”、“四”…]

但是,当我尝试将它们合并到字典中时,如下所示:

b = dict(zip(decks[1::2], decks[0::2]))
print b
我得到:{‘红心’:‘国王’,‘梅花’:‘国王’,‘黑桃’:‘国王’,‘钻石’:‘国王’}为什么它只影响国王的价值观

当我尝试使用以下代码进行纠正时:

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
我将此作为输出: 王牌、黑桃、二、三、黑桃、…]

那么是什么原因呢?帮个忙!我的意图是通过列表创建一个有点优雅的卡片组,将值附加到卡片上,创建一个记录并使用这些值来计算分数……并尝试更好地理解Python编码


谢谢

您可以使用列表comp创建一副卡片,如
[[rank,Suites]]
。并且
dict()
仅从2个值创建对象
[value1,value2]
。你不断得到
{'hearts':'King','clubs':'King','spades':'King','diamonds':'King'}
的原因是一个dict有唯一的
{key:value}
对,最后一个分配给这些键的项目是
数组中的
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]
解决方案 您可以将迪克的键设置为
等级
,并将值设置为
(等级,套装)
的数组,具有相同的
等级

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
结果 或者如果您按
套装
而不是
等级

{
  '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')
  ]
}
洗牌
谈论成倍增加列表应该迫使您使用,并通过转换为
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')]
或者,由于您似乎需要一个平面列表,只需使用
链将其展开即可。从\u iterable

decks = list(itertools.chain.from_iterable(itertools.product(suits,ranks)))

好吧…所以我对这一切还是新手。你说的单子是什么意思?在本例中,您将如何制作非平面列表?有没有办法不导入…?映射的结构是否仍然像一副可以洗牌/随机化的牌组?@thegreataus否,如果你想通过洗牌不断改变结构,请将其保留为数组如果你想使用一个
dict
,那么我能想到的唯一方法就是为每个索引创建一个随机数序列,确保它们是唯一的,然后从dict中检索它们。换句话说,选择一个随机数据组而不是排序。啊,好的。这是有道理的。我本打算尝试为这张牌设定一个值,并以此作为确定玩家牌值的一种方法……但看起来我必须采取不同的方法,穆霍斯·格雷西亚斯·森纳!你能详细解释一下为什么我会把它作为最后一段代码的输出吗?为什么它自己的列表中的黑桃会在列表中?还有……这一行代码:'deck=[(等级,套装)for suit in suit for rance for rance]'与'suit in suit:for rank in suit:deck+=(等级,套装)有何不同
[('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')]
decks = list(itertools.chain.from_iterable(itertools.product(suits,ranks)))