Python 将字符串列表转换为字典时字典更新序列错误

Python 将字符串列表转换为字典时字典更新序列错误,python,string,list,dictionary,Python,String,List,Dictionary,我有一个字符串列表,列表中的每个元素都有几个用冒号分隔的字符串。我正在尝试将每个元素转换为字典。例如,我的列表中的一个元素如下所示: attributesList[0] Out: 'Health Score: A, Happy Hour Specials: Yes, Vegan Options: Yes, Takes Reservations: Yes, Delivery: No, Take-out: Yes, Accepts Credit Cards: Yes, Good For: Brunc

我有一个字符串列表,列表中的每个元素都有几个用冒号分隔的字符串。我正在尝试将每个元素转换为字典。例如,我的列表中的一个元素如下所示:

attributesList[0]
Out: 'Health Score: A, Happy Hour Specials: Yes, Vegan Options: Yes, Takes Reservations: Yes, Delivery: No, Take-out: Yes, Accepts Credit Cards: Yes, Good For: Brunch, Lunch, Dinner, Parking: Street, Bike Parking: Yes, Wheelchair Accessible: Yes, Good for Kids: No, Good for Groups: Yes, Ambience: Casual, Trendy, Classy, Noise Level: Average, Alcohol: Beer & Wine Only, Good For Happy Hour: Yes, Outdoor Seating: Yes, Wi-Fi: Free, Has TV: No, Waiter Service: Yes, Caters: No, Gender Neutral Restrooms: Yes'
基于和中的解决方案,我尝试了以下方法:

attributesDict = dict(s.split(':') for s in attributesList)
attributesDict = dict(map(str.strip, s.split(':')) for s in attributesList)
attributesDict = dict(map(lambda s : s.split(':') for s in attributesList))
ValueError: dictionary update sequence element #0 has length 24; 2 is required
ValueError: dictionary update sequence element #0 has length 24; 2 is required
TypeError: map() must have at least two arguments.
但在每种方法中,我都会收到如下所示的错误消息:

attributesDict = dict(s.split(':') for s in attributesList)
attributesDict = dict(map(str.strip, s.split(':')) for s in attributesList)
attributesDict = dict(map(lambda s : s.split(':') for s in attributesList))
ValueError: dictionary update sequence element #0 has length 24; 2 is required
ValueError: dictionary update sequence element #0 has length 24; 2 is required
TypeError: map() must have at least two arguments.
我看到了一个解决方案,但我不清楚如何在我的环境中解决这个问题。我还有点担心冒号后面的字符串中出现多个项目,如下例所示:

 Good For: Brunch, Lunch, Dinner,
我可以将冒号后面的三个项目作为值捕获到字典中吗?我怎样才能达到我想要达到的目标

编辑:在下面添加所需的输出

attributesDict[0]
Out: {'Health Score': 'A', 'Happy Hour Specials': 'Yes', 'Vegan Options': 'Yes', 'Takes Reservations': 'Yes', 'Delivery': 'No', 'Take-out': 'Yes', 'Accepts Credit Cards': 'Yes', 'Good For': 'Brunch, Lunch, Dinner', 'Parking': 'Street', 'Bike Parking': 'Yes', 'Wheelchair Accessible': 'Yes', 'Good for Kids': 'No', 'Good for Groups': 'Yes', 'Ambience': 'Casual, Trendy, Classy', 'Noise Level': 'Average', 'Alcohol': 'Beer & Wine Only', 'Good For Happy Hour': 'Yes', 'Outdoor Seating': 'Yes', 'Wi-Fi': 'Free', 'Has TV': 'No', 'Waiter Service': 'Yes', 'Caters': 'No', 'Gender Neutral Restrooms': 'Yes'}

如果您确实想要一个dict列表作为输出,您可以执行以下操作:

def get_dict(l):
    result = {}
    for v in l.split(','):
        if ':' in v:
            key, value = v.split(':')
            result[key.strip()] = value.strip()
        else:
            result[key.strip()] += ', ' + v.strip()
    return result

[get_dict(s) for s in attributesList]

这可能写得更好,但由于可能存在多重价值观,听写理解太复杂了

如果您确实想要一个dict列表作为输出,您可以执行以下操作:

def get_dict(l):
    result = {}
    for v in l.split(','):
        if ':' in v:
            key, value = v.split(':')
            result[key.strip()] = value.strip()
        else:
            result[key.strip()] += ', ' + v.strip()
    return result

[get_dict(s) for s in attributesList]

这可能写得更好,但由于可能存在多重价值观,听写理解太复杂了

您可以使用正则表达式:

import re

def gen_key(s):
    yield from (e.group(1).strip() for e in re.finditer(r'([^,]+?):', l[0]))

def gen_values(s):
    yield from (e.group().strip(' ,') for e in re.finditer(r'(?<=[:^])(.+?)(?=[^,]*?:|$)', l[0]))

def gen(s):
    yield from zip(gen_key(s), gen_values(s))

dict(*map(gen, l))

您可以使用正则表达式:

import re

def gen_key(s):
    yield from (e.group(1).strip() for e in re.finditer(r'([^,]+?):', l[0]))

def gen_values(s):
    yield from (e.group().strip(' ,') for e in re.finditer(r'(?<=[:^])(.+?)(?=[^,]*?:|$)', l[0]))

def gen(s):
    yield from zip(gen_key(s), gen_values(s))

dict(*map(gen, l))

Use is
map(function,iterable)
so
map(lambda s:s.split(“:”),attributesList)
@Rnovice您能提供一个所需输出的示例吗?@azro,使用您的建议可以删除我帖子中的TypeError,但会导致帖子中的ValueError。您的列表attributesList到底是什么?你能分享吗?根据建议,在我的问题中包含一个预期输出。我发布的所有字符串都是我列表的第一个元素。列表中有1000多个类似的元素。使用is
map(function,iterable)
so
map(lambda s:s.split(“:”),attributesList)
@Rnovice您能提供一个所需输出的示例吗?@azro,使用您的建议会删除我帖子中的TypeError,但会导致帖子中的ValueError。您的列表属性列表是什么?你能分享吗?根据建议,在我的问题中包含一个预期输出。我发布的所有字符串都是我列表的第一个元素。列表中有1000多个类似的元素。除了一个问题,你的解决方案满足了我的要求。列表中有多个值的:对在字典中显示不准确。例如,在我发布的列表中,有两个项目,如Good For:早午餐、午餐、晚餐和氛围:休闲、时尚、优雅。但结果显示为“有益于”:“早午餐、早午餐、早午餐”和“氛围”:分别为“休闲、休闲、休闲”。可能是什么问题?我想我还需要清除当前输出中的空白。我解决了这个问题。我可以通过将else语句中的值.strip()替换为v.strip()来解决这个问题。非常感谢这个解决方案。我接受你的答案。A谢谢-这是一个打字错误,我在答案中更正了。你的解决方案符合我的要求,除了一个问题。列表中有多个值的:对在字典中显示不准确。例如,在我发布的列表中,有两个项目,如Good For:早午餐、午餐、晚餐和氛围:休闲、时尚、优雅。但结果显示为“有益于”:“早午餐、早午餐、早午餐”和“氛围”:分别为“休闲、休闲、休闲”。可能是什么问题?我想我还需要清除当前输出中的空白。我解决了这个问题。我可以通过将else语句中的值.strip()替换为v.strip()来解决这个问题。非常感谢这个解决方案。我接受你的回答。谢谢-这是一个打字错误,我在回答中更正了它。