【问题标题】:Why is this dictionary comprehension for list of dictionaries not returning values?为什么这个字典对字典列表的理解不返回值?
【发布时间】:2022-01-23 19:33:30
【问题描述】:

我正在迭代列表中的字典列表,格式如下(每个字典都与一件衣服相关,我只列出了第一个:

new_products = [{'{"uniq_id": "1234", "sku": "abcdefgh", "name": "Levis skinny jeans", '
                 '"list_price": "75.00", "sale_price": "55.00", "category": "womens"}'}]
def find_product(dictionary, uniqid):
    if 'uniq_id' in dictionary:
        if ['uniq_id'] == uniqid:
            return(keys, values in dictionary)

print(find_product(new_products, '1234'))

这是返回

None

其中if 语句的原因是并非每个产品都有uniq_id 的值,所以我在早期版本的代码中遇到了关键错误。

【问题讨论】:

  • 问题是带有"uniq_id" 的字典是new_products 列表中字典的字符串表示,而不是实际的字典对象——所以它从未被你的if
  • 但是 print(type(reviewers_dicts[1])) 返回 dict。
  • 不知道reviewers_dicts 是什么。从您的问题中显示的内容来看:type(new_products[0])<class 'set'>,并且字典的字符串表示形式是 set 的成员,它是 new_products 列表的第一个(也是唯一一个)元素。你的数据结构搞砸了。

标签: python dictionary-comprehension


【解决方案1】:

你的字典定义很不清楚。

假设你给出了一个大小为 1 的字典列表,它应该是这样的:

new_products = [{"uniq_id": "1234", "sku": "abcdefgh", "name": "Levis skinny jeans", "list_price": "75.00", "sale_price": "55.00", "category": "womens"}]

def find_product(list_of_dicts, uniqid):
    for dictionary in list_of_dicts:
        if 'uniq_id' in dictionary:
            if dictionary['uniq_id'] == uniqid:
                return dictionary

print(find_product(new_products, '1234'))

【讨论】:

  • 谢谢。我无法分享我的实际数据 - 但类型作为列表中所有元素的字典返回。但是,@kkgarg 代码也给了我一个 None 的输出,所以我接受这可能是一个数据结构问题。
  • 我们需要至少一个数据集条目才能使用,数字可以被煮熟但类型应该相同。否则我们很难对这个问题做任何事情。我从您的问题“字典列表”中推断出类型。顺便说一句,上面的示例返回字典 {'uniq_id': '1234', 'sku': 'abcdefgh', 'name': 'Levis skinny jeans', 'list_price': '75.00', 'sale_price': '55.00', 'category': 'womens'} 而不是 None
  • 当然。这是第一部字典和第二部的开头
  • [{'{"uniq_id": "b6c0b6bea69c722939585baeac73c13d", "sku": "pp5006380337", "name_title": "Alfred Dunner\\u00ae Essential Pull On Capri Pant", "description": "当您想要更新、休闲的外观和您喜欢的所有舒适时,您会一次又一次地回到我们的 Alfred Dunner 套穿紧身裤。\\u00a0 弹性腰带约 19-21\\" 内缝斜口袋聚酯可水洗进口\\u00a0 \\u00a0 \\u00a0", "list_price": "41.09", "sale_price": "24.16", "category": "alfred dunner", "category_tree": "jcpenney|women|alfred dunner", " average_product_rating": 2.625]}\n': '{"uniq_id": "93e527
  • 不知道为什么你在第二次进入之前有:!在所有条目之后,第一个大括号 { 是如何结束的?为了清楚起见,请在您的问题中添加这些详细信息。
【解决方案2】:

你正在使用这样的东西:

new_products = [{'{ "some" : "stuff" }'}]

这是一个包含集合({})的列表(外部[]

{'{ "some" : "stuff" }'}

注意{1} 是一个包含数字 1 的集合。虽然它使用花括号,但它不是字典。

你的集合包含一个字符串:

'{ "some" : "stuff" }'

如果我询问“some”是否在其中,我会返回 True,但如果我询问此字符串的键,则没有键。

使您的new_products 成为一个包含字典(而不是集合)的列表,并且不要将有效负载放在字符串中:

new_products = [{"uniq_id": "1234", 
                 "sku": "abcdefgh",
                 "name": "Levis skinny jeans",
                 "list_price": "75.00",
                 "sale_price": "55.00",
                 "category": "womens"}]

然后在你的函数中循环遍历列表中的字典:

def find_product(dictionary_list, uniqid):
    for d in dictionary_list:
        if 'uniq_id' in d:
            if d['uniq_id'] == uniqid:
                 return d.keys(), d.values()
    return "not found" # or something better



>>> find_product(new_products, '1234')
(dict_keys(['uniq_id', 'sku', 'name', 'list_price', 'sale_price', 'category']), dict_values(['1234', 'abcdefgh', 'Levis skinny jeans', '75.00', '55.00', 'womens']))
>>> find_product(new_products, '12345')
'not found'

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 2019-03-03
    • 1970-01-01
    • 2018-06-13
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多