Быстрое отображение / изменение значений в большом списке Python dicts? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть код, который я пытаюсь ускорить.Может быть, то, что у меня есть, правильно, но всякий раз, когда я спрашиваю о StackOverflow, кто-то обычно знает хитрый маленький трюк «Используйте карту!», «Попробуйте эту лямбду» или «import iteratetools», и я надеюсь, что кто-то может помочь здесь.Это раздел кода, который меня интересует:

#slowest part from here....
for row_dict in json_data:
    row_dict_clean = {}
    for key, value in row_dict.items():
        value_clean = get_cleantext(value)
        row_dict_clean[key] = value_clean
    json_data_clean.append(row_dict_clean)
    total += 1
#to here...

Концепция довольно проста.У меня есть list многомиллионного размера, который содержит словари, и мне нужно пропустить каждый value через немного чище.Затем я получаю хороший список очищенных словарей.Любой умный iterate инструмент, который я не знаю, который я должен использовать?Вот более полный MVE, чтобы помочь поиграть с ним:

def get_json_data_clean(json_data):
    json_data_clean = []
    total = 0
    #slowest part from here....
    for row_dict in json_data:
        row_dict_clean = {}
        for key, value in row_dict.items():
            value_clean = get_cleantext(value)
            row_dict_clean[key] = value_clean
        json_data_clean.append(row_dict_clean)
        total += 1
    #to here...
    return json_data_clean

def get_cleantext(value):
    #do complex cleaning stuffs on the string, I can't change what this does
    value = value.replace("bad", "good")
    return value

json_data = [
    {"key1":"some bad",
     "key2":"bad things",
     "key3":"extra bad"},
    {"key1":"more bad stuff",
     "key2":"wow, so much bad",
     "key3":"who dis?"},
    # a few million more dictionaries
    {"key1":"so much bad stuff",
     "key2":"the bad",
     "key3":"the more bad"},
]

json_data_clean = get_json_data_clean(json_data)
print(json_data_clean)

Каждый раз, когда я вкладывал в петли маленькие колокольчики в моей голове, вероятно, есть лучший способ сделать это.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 24 августа 2018

Обязательно спросите умных парней по номеру https://codereview.stackexchange.com/,, но в качестве быстрого исправления вы можете просто map() свою функцию преобразования по списку словарей, как показано ниже:

def clean_text(value: str)-> str:
    # ...
    return value.replace("bad", "good")

def clean_dict(d: dict):
    return {k:clean_text(v) for k,v in d.items()}


json_data = [
    {"key1":"some bad",
     "key2":"bad things",
     "key3":"extra bad"},
    {"key1":"more bad stuff",
     "key2":"wow, so much bad",
     "key3":"who dis?"},
    # a few million more dictionaries
    {"key1":"so much bad stuff",
     "key2":"the bad",
     "key3":"the more bad"},
]

x = list(map(clean_dict, json_data))

То, что не учитывается, это ваш total счетчик, но, похоже, он никогда не покинет get_json_data_clean().

Не уверен, почему @Daniel Gale предложил filter(), поскольку вы не пропускаете никаких значений, просто трансформируете их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...