创建 2 个列表的 Pythonic 方法,其中一个是一组重复的字符串并变成字典
Pythonic method to create 2 lists, one of which is a repeating set of strings and turn into a dict
我有一个 'widget types'、["C"、"A"、"B"] 的列表,需要为这些类型制作一个字典以对应于它们各自的 ID,1='C', 2='A', 3='B', 4='C', 5='A', 6='B', 7='C' , ETC。
我已经知道该怎么做,我只是想知道是否有比下面更优雅的 pythonic 方式来实现它,而且 dict/lists 的长度可扩展也很好,即在示例中它是10,但实际上它会有数百个小部件。
现有工作代码
wid_letter = ['C', 'A', 'B']
widgets_per_row = 10
wid_letter = wid_letter * widgets_per_row
#print("wid_letter : ", wid_letter, '\n')
ID = (list(range(1,widgets_per_row + 1,1)))
wid_type = []
# Make list of widget_letters to match length of widget ID
for i in ID:
wid_type.append(wid_letter[i-1])
print(len(wid_type))
# Turn the two lists into a dict
wid_ID_dict = dict(zip(ID, wid_type))
print('\n'*2, wid_ID_dict,'\n')
print("Widget_type: ", wid_ID_dict[1])
试试:
wid_ID_dict = dict(enumerate(wid_letter, start=1))
这会导致相同的结果,这是您要找的吗?
from itertools import cycle
wid_letter = ['C', 'A', 'B']
letter_cycle = cycle(wid_letter)
widgets_per_row = 10
wid_ID_dict = {i: next(letter_cycle) for i in range(1,widgets_per_row+1)}
print(wid_ID_dict)
您可以只使用 module
来获取所需字母的索引,而不是覆盖您的列表。然后简单的字典理解就可以完成工作:
wid_letter = ['C', 'A', 'B']
widgets_per_row = 10
wid_ID_dict = {i + 1: wid_letter[i%len(wid_letter)] for i in range(widgets_per_row)}
结果如下所示:
{1: 'C', 2: 'A', 3: 'B', 4: 'C', 5: 'A', 6: 'B', 7: 'C', 8: 'A', 9: 'B', 10: 'C'}
wid = {i:w for i,w in enumerate(wid_letter[:widgets_per_row],1)}
上面的字典理解可能是你的任务,wid在你的代码中是wid_ID_dict。
我有一个 'widget types'、["C"、"A"、"B"] 的列表,需要为这些类型制作一个字典以对应于它们各自的 ID,1='C', 2='A', 3='B', 4='C', 5='A', 6='B', 7='C' , ETC。 我已经知道该怎么做,我只是想知道是否有比下面更优雅的 pythonic 方式来实现它,而且 dict/lists 的长度可扩展也很好,即在示例中它是10,但实际上它会有数百个小部件。
现有工作代码
wid_letter = ['C', 'A', 'B']
widgets_per_row = 10
wid_letter = wid_letter * widgets_per_row
#print("wid_letter : ", wid_letter, '\n')
ID = (list(range(1,widgets_per_row + 1,1)))
wid_type = []
# Make list of widget_letters to match length of widget ID
for i in ID:
wid_type.append(wid_letter[i-1])
print(len(wid_type))
# Turn the two lists into a dict
wid_ID_dict = dict(zip(ID, wid_type))
print('\n'*2, wid_ID_dict,'\n')
print("Widget_type: ", wid_ID_dict[1])
试试:
wid_ID_dict = dict(enumerate(wid_letter, start=1))
这会导致相同的结果,这是您要找的吗?
from itertools import cycle
wid_letter = ['C', 'A', 'B']
letter_cycle = cycle(wid_letter)
widgets_per_row = 10
wid_ID_dict = {i: next(letter_cycle) for i in range(1,widgets_per_row+1)}
print(wid_ID_dict)
您可以只使用 module
来获取所需字母的索引,而不是覆盖您的列表。然后简单的字典理解就可以完成工作:
wid_letter = ['C', 'A', 'B']
widgets_per_row = 10
wid_ID_dict = {i + 1: wid_letter[i%len(wid_letter)] for i in range(widgets_per_row)}
结果如下所示:
{1: 'C', 2: 'A', 3: 'B', 4: 'C', 5: 'A', 6: 'B', 7: 'C', 8: 'A', 9: 'B', 10: 'C'}
wid = {i:w for i,w in enumerate(wid_letter[:widgets_per_row],1)}
上面的字典理解可能是你的任务,wid在你的代码中是wid_ID_dict。