Python3.x:dict-zip两个长度相同的列表会产生不同的结果



我想创建一个名为pieces的值字典,
给定字典的关键字必须是块的名称和项的Unicode字符表示

我决定写一个列表理解来检索Unicode字符和一个包含我需要的所有名称的列表。

pieces = dict(zip(['Queen','King','Tower','Bishop','Knight','Pawn']*2,[chr(int(f'265{i:X}',16)) for i in range(4,16)]))
print(pieces)
>> {'Queen': '♚', 'King': '♛', 'Tower': '♜', 'Bishop': '♝', 'Knight': '♞', 'Pawn': '♟'}

我反转了zip函数的参数,得到了:

pieces = dict(zip([chr(int(f'265{i:X}',16)) for i in range(4,16)],['Queen','King','Tower','Bishop','Knight','Pawn']*2))
print(pieces)
>> {'♔': 'Queen', '♕': 'King', '♖': 'Tower', '♗': 'Bishop', '♘': 'Knight', '♙': 'Pawn', '♚': 'Queen', '♛': 'King', '♜': 'Tower', '♝': 'Bishop', '♞': 'Knight', '♟': 'Pawn'}

我无法理解这些输出。起初,我认为第二个参数可能会"引导"字典的大小,所以我调整了名称列表的大小并混合了参数,我得到了以下结果:

pieces = dict(zip([chr(int(f'265{i:X}',16)) for i in range(4,16)],['Queen','King','Tower','Bishop','Knight','Pawn']))
print(pieces)
>> {'♔': 'Queen', '♕': 'King', '♖': 'Tower', '♗': 'Bishop', '♘': 'Knight', '♙': 'Pawn'}
pieces = dict(zip(['Queen','King','Tower','Bishop','Knight','Pawn'],[chr(int(f'265{i:X}',16)) for i in range(4,16)]))
print(pieces)
>> {'♔': 'Queen', '♕': 'King', '♖': 'Tower', '♗': 'Bishop', '♘': 'Knight', '♙': 'Pawn'}

调整大小之前:
第一行代码打印第一个列表的6个成员和最后一个列表的最后6个成员
第二行代码打印第二个列表的所有成员和第一个列表中的所有成员

调整尺寸之后:
两行都打印两个列表的前6个成员

我的问题是:为什么?

至于我的怀疑,它只能用以下雄蕊来表达:

dict只能有唯一的密钥。如果你不止一次给它同一把钥匙,它只会";记住";最后一个值。以前的值将被覆盖。

值得一提的是,zip将在Python 3.10上获得一个长度检查标志(https://www.python.org/dev/peps/pep-0618/),这将允许在提供给zip-的列表大小不同时引发错误。我想这有助于检查此类案件的合理性。

如果在python中创建一个具有重复密钥的dict,则生成的dict将具有与给定的最后一个值相关联的密钥:

>>> {1:1,1:2,1:3}
{1: 3}

这是一个非常有用的功能!

列表表示为:

>>> [chr(int(f'265{i:X}',16)) for i in range(4,16)]
['♔', '♕', '♖', '♗', '♘', '♙', '♚', '♛', '♜', '♝', '♞', '♟']

是白色的部分,然后是黑色的部分,代表12个独特的值。

使用['Queen','King','Tower','Bishop','Knight','Pawn']*2,您不会区分白色和黑色,这仅代表6个唯一值。

所以当你这样做的时候:

>>> list(zip(['Queen','King','Tower','Bishop','Knight','Pawn']*2,[chr(int(f'265{i:X}',16)) for i in range(4,16)]))
[('Queen', '♔'), ('King', '♕'), ('Tower', '♖'), ('Bishop', '♗'), ('Knight', '♘'), ('Pawn', '♙'), 
('Queen', '♚'), ('King', '♛'), ('Tower', '♜'), ('Bishop', '♝'), ('Knight', '♞'), ('Pawn', '♟')]

您可以看到,创建的dict将更新给定的第一个值(白色部分的符号),以表示给定的第二个值(黑色部分)

所以你应该这样做:

>>> piece_type=['Queen','King','Tower','Bishop','Knight','Pawn']
>>> [('White ','Black ')[i>=6]+p for i,p in enumerate(piece_type*2)]
['White Queen', 'White King', 'White Tower', 'White Bishop', 'White Knight', 'White Pawn', 
'Black Queen', 'Black King', 'Black Tower', 'Black Bishop', 'Black Knight', 'Black Pawn']

(或者只是让列表文字是12个唯一值…)

然后你会得到代表棋盘上唯一12个棋子的唯一值。


您也可以是LAZY,并使用Python库来告诉您什么是

import unicodedata as ud
li=[(p,ud.name(p)) 
for p in (chr(int(f'265{i:X}',16)) for i in range(4,16))]
>>> li
[('♔', 'WHITE CHESS KING'), 
('♕', 'WHITE CHESS QUEEN'), 
('♖', 'WHITE CHESS ROOK'), 
('♗', 'WHITE CHESS BISHOP'), 
('♘', 'WHITE CHESS KNIGHT'), 
('♙', 'WHITE CHESS PAWN'), 
('♚', 'BLACK CHESS KING'), 
('♛', 'BLACK CHESS QUEEN'), 
('♜', 'BLACK CHESS ROOK'), 
('♝', 'BLACK CHESS BISHOP'), 
('♞', 'BLACK CHESS KNIGHT'), 
('♟', 'BLACK CHESS PAWN')]

这表明['Queen','King','Tower','Bishop','Knight','Pawn']的原始列表文字将女王和国王颠倒了。

然后它会像你所期望的那样双向工作:

>>> dict((p,ud.name(p)) for p in (chr(int(f'265{i:X}',16)) for i in range(4,16)))
{'♔': 'WHITE CHESS KING', '♕': 'WHITE CHESS QUEEN', '♖': 'WHITE CHESS ROOK', '♗': 'WHITE CHESS BISHOP', '♘': 'WHITE CHESS KNIGHT', '♙': 'WHITE CHESS PAWN', '♚': 'BLACK CHESS KING', '♛': 'BLACK CHESS QUEEN', '♜': 'BLACK CHESS ROOK', '♝': 'BLACK CHESS BISHOP', '♞': 'BLACK CHESS KNIGHT', '♟': 'BLACK CHESS PAWN'}
>>> dict((ud.name(p),p) for p in (chr(int(f'265{i:X}',16)) for i in range(4,16)))
{'WHITE CHESS KING': '♔', 'WHITE CHESS QUEEN': '♕', 'WHITE CHESS ROOK': '♖', 'WHITE CHESS BISHOP': '♗', 'WHITE CHESS KNIGHT': '♘', 'WHITE CHESS PAWN': '♙', 'BLACK CHESS KING': '♚', 'BLACK CHESS QUEEN': '♛', 'BLACK CHESS ROOK': '♜', 'BLACK CHESS BISHOP': '♝', 'BLACK CHESS KNIGHT': '♞', 'BLACK CHESS PAWN': '♟'}

最新更新