2011-10-02 185 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(', ')]