从嵌套列表创建字典

2024-10-02 16:25:25 发布

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

我有一个嵌套列表,如下所示:

my_list = [['Raji GlovesSixSixOneRegular price',
  'Sale price$9.95',
  '                Save 67%'],
 ['Comp Vortex GlovesSixSixOneRegular price',
  'Sale price$9.95',
  '                Save 67%'],
 ["Shasta 3/4 Cycling Tights - Women'sSpecializedRegular price",
  'Sale price$14.95',
  '                Save 79%']]

我想创建一个嵌套字典,这样,每个列表项中的第一个值是'ItemName',第二个值是'SalePrice',第三个值是'Saving'。例如:

dict = {1: {'ItemName': 'Comp Vortex GlovesSixSixOneRegular price',
  'SalePrice': 'Sale price$9.95',
  'Saving': '                Save 79%'},
 2: {'ItemName': 'Raji GlovesSixSixOneRegular price',
  'SalePrice': 'Sale price$9.95',
  'Saving': '                Save 79%'},
 3: {'ItemName': 'Shasta 3/4 Cycling Tights - WomensSpecializedRegular price',
  'SalePrice': 'Sale price$14.95',
  'Saving': '                Save 79%'}}


keys = ('ItemName', 'SalePrice','Saving') 

我知道我可以这样做,如果我只是在列表中添加第一项:

values= my_list[0]
values
    
res = {} 
for key in keys: 
    for value in values: 
        res[key] = value 
        values.remove(value) 
        break  
res

但是如何在不删除值的情况下将其添加到字典中呢?感谢您的帮助


Tags: 列表valuemysaveressalepricelist
2条回答

大概是这样的:

from pprint import pprint


my_list = [['Raji GlovesSixSixOneRegular price',
  'Sale price$9.95',
  '                Save 67%'],
 ['Comp Vortex GlovesSixSixOneRegular price',
  'Sale price$9.95',
  '                Save 67%'],
 ["Shasta 3/4 Cycling Tights - Women'sSpecializedRegular price",
  'Sale price$14.95',
  '                Save 79%']]

my_dict = {
    n + 1: d for n, d in enumerate(
        dict(zip(['ItemName', 'SalePrice', 'Saving'], item)) for item in my_list
    )
}

pprint(my_dict)

结果:

{1: {'ItemName': 'Raji GlovesSixSixOneRegular price',
     'SalePrice': 'Sale price$9.95',
     'Saving': '                Save 67%'},
 2: {'ItemName': 'Comp Vortex GlovesSixSixOneRegular price',
     'SalePrice': 'Sale price$9.95',
     'Saving': '                Save 67%'},
 3: {'ItemName': "Shasta 3/4 Cycling Tights - Women'sSpecializedRegular price",
     'SalePrice': 'Sale price$14.95',
     'Saving': '                Save 79%'}}

注意:pprint仅用于漂亮的字典,您不需要导入来使代码本身工作

解决方案的工作原理如下:

  • 在外面,你可以理解字典,把元组的一个可数转换成字典;一个简单的例子是:
ts = [(1, 'one'), (2, 'two')]
d = {number: name for number, name in ts}
  • 它不是像该示例中那样传入元组列表,而是获取enumerate()函数的结果,该函数接受一个iterable并返回一个iterable,该iterable将每个元素与一个索引配对,例如:
# this prints [(0, 'a'), (1, 'b'), (2, 'c')]
print(list(enumerate(['a', 'b', 'c'])))
  • 你可以看到它是如何让你得到你需要的东西来填充字典的,除了它从0开始,所以这就是为什么在n之后有一个+ 1
  • enumerate()函数获取生成器表达式dict(<something>) for item in my_list)的结果。枚举生成器表达式的示例如下:
print(list(enumerate(n for n in range(10, 20))))
  • 生成器异常使用zip(),它获取两个iterable并将结果配对,在本例中是内部字典所需的键['ItemName', 'SalePrice', 'Saving']和原始列表中的列表,一个接一个,由生成器表达式传递给它。尝试运行以下命令:
print(list(list(zip(['ItemName', 'SalePrice', 'Saving'], item)) for item in my_list))

这应该会让你知道发生了什么

通常,如果您收到一段代码,但您无法真正说出原因,请尝试查看表达式是如何组合在一起的。如果你真的把它拆开,它看起来是这样的:

my_dict = {
    number + 1: dict_element 
    for number, dict_element  in enumerate(
        dict(
            zip(['ItemName', 'SalePrice', 'Saving'], item)
        ) 
        for item in my_list
    )
}

然后试着理解每一点,从内部开始。因此,在本例中,您需要了解zip()的作用。玩转函数,直到理解它,然后再上一层,看看dict()zip()函数的结果做了什么。一旦你得到它,看看为什么它后面有一个for(它是一个生成器),等等

当然,如果您希望您的代码比其他任何代码都短,这是相同的,但很难理解:

d = {n+1: d for n, d in enumerate(dict(zip(['ItemName','SalePrice','Saving'], x)) for x in my_list)}

我很感激你要求解释,因为这意味着你在努力学习,而不仅仅是抄袭答案——坚持下去

如果你真的想发疯,这是我的解决方案。很难描述

enumerate基本上为数组中的每个元素返回两项,第一项是索引号,第二项是实对象。这样我们就可以在适当的位置计算。然后,我们将其指定为外部dict中的键,并将该键的值插入带有数组值的内部字典

我还使用了.strip函数来删除不必要的空格等

from pprint import pprint

my_list = [['Raji GlovesSixSixOneRegular price',
  'Sale price$9.95',
  '                Save 67%'],
 ['Comp Vortex GlovesSixSixOneRegular price',
  'Sale price$9.95',
  '                Save 67%'],
 ["Shasta 3/4 Cycling Tights - Women'sSpecializedRegular price",
  'Sale price$14.95',
  '                Save 79%']]


newDict = {i + 1: {"ItemName": arr[0].strip(), "SalePrice": arr[1].strip(), "Saving": arr[2].strip()} for i, arr in enumerate(my_list)}

pprint(newDict)

以下是上述解决方案的基本等式:

newDict = {}
for i, arr in enumerate(my_list):
    newDict[i + 1] = {}
    newDict[i + 1]["ItemName"] = arr[0]
    newDict[i + 1]["SalePrice"] = arr[1]
    newDict[i + 1]["Saving"] = arr[2]


pprint(newDict)

这是另一个简单的解决方案,在这里我们定义一个字典,并将起始数字定义为1,迭代my_list数组,然后在该迭代中分配一个字典。在字典中,我们可以从arr对象填充

i = 1
newDict = {}
for arr in my_list:
    newDict[i] = {
        "ItemName": arr[0].strip(),
        "SalePrice": arr[1].strip(),
        "Saving": arr[2].strip(),
    }
    i += 1

输出

{1: {'ItemName': 'Raji GlovesSixSixOneRegular price',
     'SalePrice': 'Sale price$9.95',
     'Saving': 'Save 67%'},
 2: {'ItemName': 'Comp Vortex GlovesSixSixOneRegular price',
     'SalePrice': 'Sale price$9.95',
     'Saving': 'Save 67%'},
 3: {'ItemName': "Shasta 3/4 Cycling Tights - Women'sSpecializedRegular price",
     'SalePrice': 'Sale price$14.95',
     'Saving': 'Save 79%'}}

相关问题 更多 >