python3.x:dict-zip相同长度的两个列表具有不同的结果

python3.x:dict-zip相同长度的两个列表具有不同的结果,python,python-3.x,dictionary,list-comprehension,Python,Python 3.x,Dictionary,List Comprehension,我想创建一个名为“片段”的价值字典, 给定字典的键必须是工件的名称和项目,它是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': '♚',

我想创建一个名为“片段”的价值字典, 给定字典的键必须是工件的名称和项目,它是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将在Python3.10上获得一个长度检查标志,当给zip的列表大小不同时,该标志将允许引发错误。我想它可以帮助检查这种情况。

dict只能有唯一的键。如果您多次给它相同的键,它只会记住最后一个值。以前的值将被覆盖

值得一提的是,zip将在Python3.10上获得一个长度检查标志,当给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个棋子的唯一值

您也可以懒惰,使用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')]
这表明原来的列表文字[‘皇后’、‘国王’、‘塔楼’、‘主教’、‘骑士’、‘典当’]与皇后和国王相反

然后,它在两个方面都能正常工作:

>>> 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': '♟'}
如果在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个棋子的唯一值

您也可以懒惰,使用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')]
这表明原来的列表文字[‘皇后’、‘国王’、‘塔楼’、‘主教’、‘骑士’、‘典当’]与皇后和国王相反

然后,它在两个方面都能正常工作:

>>> 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': '♟'}

zip只处理到已传递的最短iterable的长度。您希望使用来自['Queen'、'King'、'Tower'、'Bishop'、'Knight'、'Pawn']*2的密钥执行dict-但dict密钥是唯一的,因此会被更新的密钥覆盖pair@h4z3正如我在莫蒂茨克回答的那样,我太笨了,我今天应该多喝点咖啡!我将此帖子另存为我的桌面图像作为警告!:Pzip只处理到它已传递的最短iterable的长度。您希望使用来自['Queen'、'King'、'Tower'、'Bishop'、'Knight'、'Pawn']*2的密钥执行dict-但dict密钥是唯一的,因此会被更新的密钥覆盖pair@h4z3正如我在莫蒂茨克回答的那样,我太笨了,我今天应该多喝点咖啡!我将此帖子另存为我的桌面图像作为警告!:PIf-zip有不同大小的可伸缩性,这始终不是zip的两个元素长度不同的问题。[女王],'Ki
ng'、'Tower'、'Bishop'、'Knight'、'Pawn']*2是与unicode字符范围相同的12个元素。问题只在于6个键值被新值覆盖。你是对的,但正如你在问题中看到的那样-Fabio考虑了这个选项,因为不同的长度问题,他们的代码不能工作。我列出的技巧有助于尽早消除这个选项。如果zip有不同大小的iterables,那么对于zip来说,这永远不是两个元素长度不同的问题。['Queen'、'King'、'Tower'、'Bishop'、'Knight'、'Pawn']*2是与unicode字符范围相同的12个元素。问题只在于6个键值被新值覆盖。你是对的,但正如你在问题中看到的那样-Fabio考虑了这个选项,因为不同的长度问题,他们的代码不能工作。我列出的技巧有助于尽早消除这种选择。