2016-11-23 2 views
5

У меня есть список строк (от .tt файла), который выглядит следующим образом:словарь Populate из списка

list1 = ['have\tVERB', 'and\tCONJ', ..., 'tree\tNOUN', 'go\tVERB'] 

Я хочу, чтобы превратить его в словарь, который выглядит как:

dict1 = { 'have':'VERB', 'and':'CONJ', 'tree':'NOUN', 'go':'VERB' } 

Я думал о замене, но это не так хорошо. Есть ли способ пометить строку табуляции '\t' как разделитель?

+3

'' have ':' VERB'' вы имеете в виду? –

+2

ключи 'dict' должны быть уникальными. – user2728397

ответ

4

сделать это с помощью простого Dict понимания и str.split (без аргументов strip расщепляется на бланках)

list1 = ['have\tVERB', 'and\tCONJ', 'tree\tNOUN', 'go\tVERB'] 
dict1 = {x.split()[0]:x.split()[1] for x in list1} 

результат:

{'and': 'CONJ', 'go': 'VERB', 'tree': 'NOUN', 'have': 'VERB'} 

EDIT: x.split()[0]:x.split()[1] делает split дважды, что не является оптимальным , Другие ответы здесь делают это лучше без понимания.

16

Попробуйте следующее:

dict1 = dict(item.split('\t') for item in list1) 

Выход:

>>>dict1 
{'and': 'CONJ', 'go': 'VERB', 'tree': 'NOUN', 'have': 'VERB'} 
+1

<3 Pythonic - это путь <3 – Pitto

+5

' [] 'избыточны, выражение генератора будет работать нормально и будет использовать меньше памяти в процессе. –

+0

@ ŁukaszRogalski отредактировал, спасибо за замечание :) – ettanany

3

короткий способ решить эту проблему, так как раскол метод расщепляется '\t' по умолчанию (как отметил Джим Fasarakis-Хиллардом), могут быть:

dictionary = dict(item.split() for item in list1) 
print dictionary 

Я также написал более простой и классический подход.

Не очень вещий, но легко понять, для начинающих:

list1 = ['have\tVERB', 'and\tCONJ', 'tree\tNOUN', 'go\tVERB'] 
dictionary1 = {} 

for item in list1: 
    splitted_item = item.split('\t') 
    word = splitted_item[0] 
    word_type = splitted_item[1] 
    dictionary1[word] = word_type 

print dictionary1 

Здесь я написал один и тот же код с очень многословные комментарии:

# Let's start with our word list, we'll call it 'list1' 

list1 = ['have\tVERB', 'and\tCONJ', 'tree\tNOUN', 'go\tVERB'] 

# Here's an empty dictionary, 'dictionary1' 

dictionary1 = {} 

# Let's start to iterate using variable 'item' through 'list1' 

for item in list1: 

# Here I split item in two parts, passing the '\t' character 
# to the split function and put the resulting list of two elements 
# into 'splitted_item' variable. 
# If you want to know more about split function check the link available 
# at the end of this answer 

    splitted_item = item.split('\t') 

# Just to make code more readable here I now put 1st part 
# of the splitted item (part 0 because we start counting 
# from number 0) in "word" variable 

    word = splitted_item[0] 

# I use the same apporach to save the 2nd part of the 
# splitted item into 'word_type' variable 
# Yes, you're right: we use 1 because we start counting from 0 

    word_type = splitted_item[1] 

# Finally I add to 'dictionary1', 'word' key with a value of 'word_type' 

    dictionary1[word] = word_type 

# After the for loop has been completed I print the now 
# complete dictionary1 to check if result is correct 

print dictionary1 

Полезные ссылки:

  • Вы можете быстро скопируйте и вставьте этот код здесь, чтобы проверить, как он работает, и настройте его, если хотите: http://www.codeskulptor.com
  • Если вы хотите узнать больше о разъемных и строковых функциях в целом: https://docs.python.org/2/library/string.html
7

С str.splitтакже расщепляется на '\t' по умолчанию ('\t' считаются белым пространством), вы могли бы получить функциональный подход по кормлению dict с map, который выглядит довольно элегантно:

d = dict(map(str.split, list1)) 

со словарем d теперь в разыскиваемой форме:

print(d) 
{'and': 'CONJ', 'go': 'VERB', 'have': 'VERB', 'tree': 'NOUN'} 

Если вам нужен раскол только на'\t' (игнорируя при этом ' ' и '\n') и по-прежнему хотите использовать map подход, можно создать частичный объект functools.partial, который использует только '\t' как сепаратор:

from functools import partial 

# only splits on '\t' ignoring new-lines, white space e.t.c 
tabsplit = partial(str.split, sep='\t') 
d = dict(map(tabsplit, list1)) 

это, конечно, дает тот же результат для d с помощью списка выборки строки.

+0

Может быть, более откровенно функциональный, но это явно не питонический. –

Смежные вопросы