2011-10-02 225 views
7

創建名單上有串蟒蛇:從字符串

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

的名單,我想創建一個列表

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

這是一個簡單的方法來做到這一點?如果你需要他們中的一些轉換爲數字並提前哪些,一些額外的代碼將需要不知道

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

回答

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我不知道,如果你正在嚴重或不! ;-)似乎並不是Pythonic。列表理解有它們的位置,但我認爲它們可能過分。或者這也許就是我對他們不熟悉。 –

+0

絕對嚴重!它非常可讀。我認爲這是一個可以使用列表理解*的經典例子,但最終並不是最好的選擇。 – user

+0

這是一個風格問題,我猜想,我更喜歡列表理解! – wim

6

試試這個。嘗試這樣的:

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) 

這比其他答案更長,但它更通用。

2
比別人

更簡潔:

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

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

另外,如果您的格式固定爲<string>, <int>, <int>,你可以更簡潔:

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

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

我知道這是舊的,但這裏有一個一個班輪列表理解:

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] 

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