2016-11-23 33 views
5

Tôi có một danh sách các chuỗi (từ một tập tin .tt) trông như thế này:cư từ điển từ danh sách

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

tôi muốn biến nó thành một cuốn từ điển đó trông giống như:

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

Tôi đã nghĩ đến việc thay thế, nhưng nó không hoạt động tốt. Có cách nào để gắn thẻ chuỗi tab '\t' làm dải phân cách không?

+3

''have': 'VERB'' ý của bạn là gì? –

+2

'dict' phím nên là duy nhất – user2728397

Trả lời

4

làm điều đó với một sự hiểu biết đơn giản dict và str.split (không có đối số strip chia tách vào ô trống)

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

kết quả:

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

EDIT: các x.split()[0]:x.split()[1] không split hai lần, mà không phải là tối ưu . Các câu trả lời khác ở đây làm tốt hơn mà không cần đọc hiểu.

16

Hãy thử như sau:

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

Output:

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

<3 Pythonic là cách <3 – Pitto

+5

' [] 'là dư thừa, biểu hiện máy phát điện sẽ làm việc tốt và sẽ sử dụng ít bộ nhớ trong một quá trình. –

+0

@ ŁukaszRogalski chỉnh sửa, cảm ơn cho nhận xét :) – ettanany

3

Một cách ngắn để giải quyết vấn đề này, vì phương pháp chia tách '\t' theo mặc định (như đã chỉ ra bởi Jim Fasarakis-Hilliard), có thể là:

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

Tôi cũng viết ra một cách tiếp cận đơn giản và cổ điển hơn.

Không rất pythonic nhưng dễ hiểu cho người mới bắt đầu:

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 

Ở đây tôi đã viết cùng mã với ý kiến ​​rất chi tiết:

# 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 

Liên kết hữu ích:

7

Kể từ str.splitcũng chia rẽ trên '\t' theo mặc định ('\t' được coi là khoảng trắng), bạn có thể nhận được một cách tiếp cận chức năng bằng cách cho ăn dict với một map trông khá thanh lịch:

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

với điển d tại vốn có hình truy nã:

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

Nếu bạn cần một sự chia rẽ chỉ trên'\t' (trong khi bỏ qua ' ''\n') và vẫn muốn sử dụng cách tiếp cận map, bạn có thể tạo một đối tượng cục bộ với functools.partial mà chỉ sử dụng '\t' như dấu tách:

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

điều này, tất nhiên, mang lại kết quả tương tự cho d bằng danh sách mẫu dây.

+0

Có thể là công khai hơn, nhưng điều này rõ ràng không phải là pythonic. –

Các vấn đề liên quan