2012-02-09 45 views
6

Hãy nói rằng tôi có một danh sáchPython Bản đồ Danh sách Strings để Integer Danh sách

l = ['michael','michael','alice','carter'] 

Tôi muốn bản đồ nó như sau:

k = [1,1,2,3] 

đâu michael tương ứng với 1, alice tương ứng với 2 vv Có một chức năng trong Python để làm điều này một cách dễ dàng?

Trả lời

10

Có một cái nhìn tại ord, mang đến cho số unicode cho một ký tự cho trước:

>>> letters = ['a','b','c','d','e','f','g'] 
>>> [ord(x) for x in letters] 
[97, 98, 99, 100, 101, 102, 103] 

Vì vậy, bạn có thể làm ord(x)-96 để c onvert a-z đến 1-26 (cẩn thận về chữ hoa, v.v.).

l = ['a','b','a','c'] 
k = [ord(x)-96 for x in l] # [1,2,1,3] 

Một lần nữa, hãy cẩn thận về chữ hoa và chữ thường.

+1

Điều này chỉ hoạt động cho một danh sách các ký tự, không phải cho một danh sách các chuỗi như trong câu hỏi của OP. – user2739472

+0

Lưu ý rằng câu hỏi ban đầu chỉ có một danh sách các ký tự. Bản chỉnh sửa cho câu hỏi được đưa ra sau khi câu trả lời này được đưa ra và chấp nhận! –

+0

Ah Tôi không nhận thấy điều đó. Trong trường hợp đó, tôi muốn OP đã hỏi câu hỏi 'chuỗi' như một câu hỏi riêng biệt. Cảm ơn. – user2739472

1

Chức năng là zip

Ví dụ:

>>> l = ['a','b','a','c'] 
>>> k = [1,2,1,3]¨ 
>>> zip(l,k) 
[('a', 1), ('b', 2), ('a', 1), ('c', 3)] 

Nếu bạn muốn sử dụng các hạng mục l như chỉ mục, bạn muốn một từ điển:

>>> d = dict(zip(l,k)) 
>>> d 
{'a': 1, 'c': 3, 'b': 2} 
>>> d['a'] 
1 
>>> d['c'] 
3 
>>>  
+1

zip không kiểm tra thư từ, nếu k được đảo ngược, kết quả sẽ khác. – vikki

0

thể làm điều đó khá dễ dàng không có chức năng:

j - list()  
for i in range (len(l)) : 
    j.append((l[i],k[i])) 
0

Từ câu hỏi của bạn không rõ ràng nếu bạn muốn tạo ra k dựa trên l hoặc cả l và k được cho.

Nếu bạn đang tìm cách tạo k dựa trên l, câu trả lời của @ math.coffee nên làm.

Nếu bạn muốn bản đồ từ các mục từ l đến k, hiển nhiên, các mục của bạn trong l phải là duy nhất.

Xem nếu điều này là những gì bạn đang tìm kiếm

dict((l[index], k[index]) for index in range(len(l))) 

Hoặc nếu không, nếu bạn đang tìm kiếm các bộ:

[(l[index], k[index]) for index in range(len(l))] 
2

Nếu tôi đọc bạn một cách chính xác, bạn muốn để có một danh sách các nhân vật và chuyển đổi chúng thành các số nguyên, với một sinh mệnh 1, b là 2, vv

l = ['a','b','a','c'] 
k = [ord(x.upper()) - 64 for x in l] 

ném upper() trong có rất nó không quan trọng cho dù họ là trường hợp trên hoặc thấp hơn.

+0

wow, khấu trừ tốt đẹp! – WeaselFox

2

Để ánh xạ danh sách các số nguyên để liệt kê các chuỗi Tôi sẽ sử dụng một cuốn từ điển, ví dụ:

> name_number = {'michael':1, 'michael':1, 'alice':2, 'carter':3} 
> print len(name_number) 
    3 
> print name_number['alice'] 
    2 

Lưu ý rằng len(name_number)3, vì chìa khóa trùng lặp không được phép.

4

Để trả lời câu hỏi đã chỉnh sửa, tức là, để ánh xạ danh sách các chuỗi thành các số nguyên duy nhất, đầu tiên phải tìm các chuỗi duy nhất và sau đó thực hiện 1-1 ánh xạ các chuỗi thành số nguyên trong danh sách chuỗi ban đầu. Ví dụ:

s = ['michael','michael','alice','carter'] 

thì chuỗi duy nhất là {'michael','alice','carter'}. Bây giờ, chuyển đổi các chuỗi này thành các số nguyên theo 1-1 ánh xạ như {'michael','alice','carter'} =[1,2,3] bằng từ điển {'michael':1,'alice':2,'carter':3}. Trong bước thứ ba, lặp qua danh sách chuỗi gốc; tìm chuỗi trong từ điển cho số nguyên tương ứng và thay thế chuỗi theo số nguyên đó.

s=['michael','michael','alice','carter'] 

mydict={} 
i = 0 
for item in s: 
    if(i>0 and item in mydict): 
     continue 
    else:  
     i = i+1 
     mydict[item] = i 

k=[] 
for item in s: 
    k.append(mydict[item]) 

Output:

k=[1, 1, 2, 3] 
2

Làm thế nào về việc sử dụng Pandas? import pandas as pd l = ['michael','michael','alice','carter'] pd.Series(l).astype('category').cat.codes.values

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