2011-10-02 72 views
7

Tôi có danh sách các chuỗipython: tạo danh sách từ chuỗi

a = ['word1, 23, 12','word2, 10, 19','word3, 11, 15'] 

Tôi muốn tạo ra một danh sách

b = [['word1',23,12],['word2', 10, 19],['word3', 11, 15]] 

Đây có phải là một cách dễ dàng để làm được điều này?

Trả lời

22
input = ['word1, 23, 12','word2, 10, 19','word3, 11, 15'] 
output = [] 
for item in input: 
    items = item.split(',') 
    output.append([items[0], int(items[1]), int(items[2])]) 
+2

@Oliver Tôi không chắc liệu bạn có nghiêm túc hay không! ;-) Không có vẻ như tất cả những gì Pythonic. Việc hiểu danh sách có vị trí của chúng nhưng chúng có thể bị quá tải trong quan điểm của tôi. Hoặc có lẽ đó chỉ là sự thiếu hiểu biết của tôi với họ. –

+0

Chắc chắn là nghiêm trọng! Nó rất dễ đọc. Tôi nghĩ rằng đây là một ví dụ điển hình mà danh sách * có thể * được sử dụng, nhưng cuối cùng không phải là cách tốt nhất để đi. – user

+0

Đó là vấn đề về phong cách tôi đoán, tôi thích đọc danh sách hơn! – wim

6

Hãy thử điều này:

b = [ entry.split(',') for entry in a ] 
b = [ b[i] if i % 3 == 0 else int(b[i]) for i in xrange(0, len(b)) ] 
1

Nếu bạn cần phải chuyển đổi một số trong số họ đến các số và không biết trước cái nào, một số mã bổ sung sẽ là cần thiết. Hãy thử một cái gì đó như thế này:

b = [] 
for x in a: 
    temp = [] 
    items = x.split(",") 
    for item in items: 
     try: 
      n = int(item) 
     except ValueError: 
      temp.append(item) 
     else: 
      temp.append(n) 
    b.append(temp) 

Đây là dài hơn các câu trả lời khác, nhưng nó linh hoạt hơn.

2

ngắn gọn hơn những người khác:

def parseString(string): 
    try: 
     return int(string) 
    except ValueError: 
     return string 

b = [[parseString(s) for s in clause.split(', ')] for clause in a] 

Ngoài ra nếu định dạng của bạn là cố định như <string>, <int>, <int>, bạn có thể thậm chí ngắn gọn hơn:

def parseClause(a,b,c): 
    return [a, int(b), int(c)] 

b = [parseClause(*clause) for clause in a] 
1

Tôi biết điều này là cũ nhưng đây là một một danh sách lớp lót hiểu:

data = ['word1, 23, 12','word2, 10, 19','word3, 11, 15'] 

[[int(item) if item.isdigit() else item for item in items.split(', ')] for items in data] 

hoặc

[int(item) if item.isdigit() else item for items in data for item in items.split(', ')] 
Các vấn đề liên quan