Мне регулярно нужно читать данные из файлов (обычно значения, разделенные табуляцией) и преобразовывать их в словари. Обычно мне просто нужно сопоставить один из столбцов с другим, но также может быть некоторая обработка значений (например, удаление пробелов). Я пытался придумать шаблон понимания dict, чтобы сделать это, но я продолжаю сталкиваться с небольшими неприятностями, которые мешают мне последовательно реализовать его наиболее кратким и понятным способом. И у меня есть ощущение, что, вероятно, есть лучший способ.
Итак, вот (некоторые) способы, которые я пробовал, и где они пошли не так:
with open(path) as f: return {line.split("\t")[0].strip(): line.split("\t")[1].strip() for line in f}
Это то, чем я часто пользуюсь. Это позволяет мне изменять ключ и значение на месте и будет работать с любым из столбцов (например, если я хочу сопоставить значения из третьего столбца с первым). Очевидной проблемой является дублирование части line.split()
. Есть ли способ привязать line.split("\t")
к временной переменной или распаковать значения непосредственно в переменные?
with open(path) as f: return dict(line.split("\t")[:2] for line in f)
Я только что придумал это. Это хорошо работает для этого простого случая (просто сопоставление первого столбца со вторым без какой-либо обработки), но не распространяется на другие случаи. Дополнительную обработку выполнить сложно, а используемые столбцы должны быть смежными. Это также не строгое понимание dict, и его нельзя превратить в одно, потому что оно использует срезы.
d = dict() for line in open(path): d.update({line.split("\t")[0]: line.split("\t")[1]}) return d
Конечно, я мог бы просто сначала создать словарь, а затем обновлять каждую строку. Но теперь я должен создать dict и вернуть его отдельно, а дублирование кода все еще существует.
Я также поиграл с вложенными пониманиями dict и распаковал разделенную строку в переменные, но столкнулся с другими проблемами.