Ошибка последовательности обновления словаря при преобразовании списка строк в словарь - PullRequest
1 голос
/ 16 марта 2020

У меня есть список строк, и каждый элемент списка имеет несколько строк, разделенных двоеточием. Я пытаюсь преобразовать каждый элемент в словарь. Например, один элемент в моем списке выглядит следующим образом:

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'

На основе решений в ссылка 1 и ссылка 2 , я попробовал следующие подходы:

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'}

Ответы [ 2 ]

3 голосов
/ 16 марта 2020

Если вы действительно хотите, чтобы список 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 будет слишком сложным ,

0 голосов
/ 17 марта 2020

Вы можете использовать регулярные выражения:

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))

вывод:

{'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 &amp; 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'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...