Python 3.x: dict zip 两个相同长度的列表有不同的结果
Python 3.x: dict zip two list of the same length has different results
我想创建一个名为 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'}
我无法理解这些输出。起初我以为第二个参数 'leads' 可能是字典的大小所以我调整了我的名字列表的大小并混合了参数,我得到了以下结果:
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 个成员
我的问题是:为什么?
至于我的不信,只能用下面的一句话来表达:
A dict
只能有唯一键。如果你多次给它同一个键——它只会“记住”最后一个值。以前的值将被覆盖。
值得一提的是,zip
将在 Python 3.10 (https://www.python.org/dev/peps/pep-0618/) 上获得长度检查标志,这将在向 [=11= 提供列表时引发错误] - 大小不一。我想它可以帮助检查此类情况的完整性。
如果您在 python 中创建一个具有重复键的 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', '♟')]
您可以看到创建的字典将更新给定的第一个值(白色块的符号)以表示给定的第二个值(黑色块。)
所以你应该这样做:
>>> 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 个棋子的唯一值。
你也可以懒惰,使用 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']
的原始列表字面量颠倒了 Queen 和 King。
然后它会按您预期的方式工作:
>>> 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': '♟'}
我想创建一个名为 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'}
我无法理解这些输出。起初我以为第二个参数 'leads' 可能是字典的大小所以我调整了我的名字列表的大小并混合了参数,我得到了以下结果:
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 个成员
我的问题是:为什么?
至于我的不信,只能用下面的一句话来表达:
A dict
只能有唯一键。如果你多次给它同一个键——它只会“记住”最后一个值。以前的值将被覆盖。
值得一提的是,zip
将在 Python 3.10 (https://www.python.org/dev/peps/pep-0618/) 上获得长度检查标志,这将在向 [=11= 提供列表时引发错误] - 大小不一。我想它可以帮助检查此类情况的完整性。
如果您在 python 中创建一个具有重复键的 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', '♟')]
您可以看到创建的字典将更新给定的第一个值(白色块的符号)以表示给定的第二个值(黑色块。)
所以你应该这样做:
>>> 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 个棋子的唯一值。
你也可以懒惰,使用 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']
的原始列表字面量颠倒了 Queen 和 King。
然后它会按您预期的方式工作:
>>> 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': '♟'}