2013-10-26 80 views
1

内我有一个字符串的嵌套列表:的Python - 返回字符串的子串嵌套列表

d = [['one\\alpha','two\\beta','three\\gamma'],['foo\\data','bar\\params']] 

我想要做的就是给出的列表d返回一个列表:

data = [['alpha','beta','gamma'],['data','params']]       

这是遍历d中每个内部列表的每个元素并返回\\之后的子字符串。

我一个解决方案,尝试是:

data = [] 
for n in range(len(d)): 
    for m in range(len(d[n])): 
    a = str(d[n][m]) 
    data.append(a.split("\\")[1]) 

主要生产:data = ['alpha', 'beta', 'gamma', 'data', 'params']

将会产生正确的顺序正确的字符串,但我失去的名单d是如何嵌套的性质。无论如何,产生data列表d保持嵌套结构?

编辑:

我其实只是管理这个使用来解决:

[[d[n][m].split("\\")[1] for m in range(len(d[n]))] for n in range(len(d))] 
+0

高兴你设法自行解决。不过,这不是很可读......你几乎不需要在它使用'range'在一个物体的长度,以循环 –

+0

谢谢你的提示。学习Python,一点一滴。 – Holtz

回答

0

您需要使用列表中的每个输入列表中列出的:

data = [] 
for n in range(len(d)): 
    sublist = [] 
    for m in range(len(d[n])): 
     a = str(d[n][m]) 
     sublist.append(a.split("\\")[1]) 
    data.append(sublist) 

这给出了预期的结果:

>>> data 
[['alpha', 'beta', 'gamma'], ['data', 'params']] 

您也可以使用列表理解来达到相同的结果:

data = [[value.split('\\')[1] for value in item] for item in d] 
2

您可以使用列表-COMP:

d = [['one\\alpha','two\\beta','three\\gamma'],['foo\\data','bar\\params']] 
new = [[el.partition('\\')[2] for el in item] for item in d] 
# [['alpha', 'beta', 'gamma'], ['data', 'params']] 
+0

使用分区方法和使用split方法有什么不同? – Holtz

+1

分区只拆分一次,并且如果没有找到分隔符,将保证第二个拆分的空字符串......当使用拆分时,并试图获取元素时,它可能会在尝试访问它时抛出一个“IndexError”(例如:''hello'.split('x')[1]'将会中断)而使用分区时它不会,它只会是空白的 –

2

这是我的看法:

>>> lst = [['one\\alpha','two\\beta','three\\gamma'],['foo\\data','bar\\params']] 
>>> [[y.split('\\')[1] for y in x] for x in lst] 
[['alpha', 'beta', 'gamma'], ['data', 'params']] 
>>> 

重要部分是list comprehensionstr.split

0

列表理解解决方案只是为了它。

d = [['one\\alpha','two\\beta','three\\gamma'],['foo\\data','bar\\params']] 
index_to_get = 1 

data = [ 
    list(values[index_to_get]) for values in (
     zip(*(string.split("\\") for string in nested_list)) 
     for nested_list in d 
    ) 
] 

print(data) 
>> [['alpha', 'beta', 'gamma'], ['data', 'params']] 
相关问题