从列表中创建具有类似元素的动态词典

2024-10-01 15:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个列表中创建一些动态字典,其中包含重复的项,并将它们在列表中的索引号作为键

我试着这样做:

theList = ['A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'D', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'F', 'F', 'F']
newDict ={}
index = 0
for x in theList:
    while x == "A":
       newDict[index] = x
       index += 1    
print(newDict) 

但是,即使使用硬编码(不需要)如while x == "A":,我也无法返回结果

打印时所需的输出:动态字典如下所示:

{1: 'A', 2: 'A'}
{3: 'B', 4: 'B', 5: 'B', 6: 'B', 7: 'B'}
{8: 'C', 9: 'C', 10: 'C', 11: 'C', 12: 'B', 13: 'C', 14: 'C', 15: 'C', 16: 'C', 17: 'C' , 18: 'C'}
{19: 'D'}

{20: 'E', 21: 'E', 22: 'E', 23: 'E', 24: 'E',25: 'E', 26: 'E', 27: 'E', 28: 'E'}
{29: 'F', 30: 'F', 31: 'F'}

Tags: in编码列表forindex字典动态print
3条回答

您可以使用itertools.groupbyenumerate

from itertools import groupby
from operator import itemgetter

theList = ['A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'D', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'F', 'F', 'F']

output = [dict(v) for _, v in groupby(enumerate(theList, start=1), key=itemgetter(1))]
print(output)

# [{1: 'A', 2: 'A'},
#  {3: 'B', 4: 'B', 5: 'B', 6: 'B', 7: 'B'},
#  {8: 'C', 9: 'C', 10: 'C', 11: 'C', 12: 'C', 13: 'C', 14: 'C', 15: 'C', 16: 'C', 17: 'C', 18: 'C'},
#  {19: 'D'},
#  {20: 'E', 21: 'E', 22: 'E', 23: 'E', 24: 'E', 25: 'E', 26: 'E', 27: 'E', 28: 'E'},
#  {29: 'F', 30: 'F', 31: 'F'}]

enumerate创建一个成对的迭代器(1, 'A')(2, 'A'),…,然后groupby根据第二项(通过设置key=itemgetter(1))将其切块

如果我正确理解了这个问题,您可以使用globalslocals内置项创建动态变量(我在下面使用globals)。但这可能会有问题,因此您需要小心

theList = [
    'A', 'A',
    'B', 'B', 'B', 'B', 'B',
    'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
    'D',
    'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
    'F', 'F', 'F'
]

theDict = dict(enumerate(theList))

for item, value in theDict.items():
    dict_name = value + '_dict'
    if dict_name not in globals():  # avoid overwriting
        globals()[dict_name] = {
           k: v
           for k, v in theDict.items()
           if v == value
        }

我将为字典创建的变量命名为[KEY]_dict(例如,A_dictB_dict,等等)

使用enumerate迭代列表的索引和元素:

提案1

from collections import defaultdict

newDict = defaultdict(list)
for idx, key in enumerate(theList):
    newDict[key].append(idx)

# Same code as above without defaultdict
# for idx, key in enumerate(theList):
#     lst = newDict.setdefault(key, [])
#     lst.append(idx)

输出:

>>> newDict
defaultdict(list,
            {'A': [0, 1],
             'B': [2, 3, 4, 5, 6],
             'C': [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
             'D': [18],
             'E': [19, 20, 21, 22, 23, 24, 25, 26, 27],
             'F': [28, 29, 30]})

提案2

newDict = dict(enumerate(theList))

输出:

>>> newDict
{0: 'A',
 1: 'A',
 2: 'B',
 3: 'B',
 4: 'B',
 5: 'B',
 6: 'B',
 7: 'C',
 8: 'C',
 9: 'C',
 10: 'C',
 11: 'C',
 12: 'C',
 13: 'C',
 14: 'C',
 15: 'C',
 16: 'C',
 17: 'C',
 18: 'D',
 19: 'E',
 20: 'E',
 21: 'E',
 22: 'E',
 23: 'E',
 24: 'E',
 25: 'E',
 26: 'E',
 27: 'E',
 28: 'F',
 29: 'F',
 30: 'F'}

相关问题 更多 >

    热门问题