嵌套列表理解示例
Nested List Comprehensions Example
问题
我有下一个清单:
a = (('_a_1', '_a_2'), [0.3, 0.6])
b = (('_a_3', '_a_4'), [0.15, 0.56])
c = (('_a_5', '_a_6'), [0.22, 0.6])
l = [a, b, c]
我不想要的:选择列表的第一个元组并删除 _a_
标签。
结果:
[['1','2'],['3','4'],['5','6']]
我试过的
我知道我可以使用 列表理解 来做到这一点。但我无法理解它:D
我在尝试什么:
[ el.replace('_a_','') for m in l for el in m[0]]
结果:
['1', '2', '3', '4', '5', '6']
我认为这对正确的解决方案是封闭的。只需添加如下内容:
[ [el.replace('_a_','') for m in l] for el in m[0]]
但是不行...
这是使用 str.split
的一种方法:
a = (('_a_1', '_a_2'), [0.3, 0.6])
b = (('_a_3', '_a_4'), [0.15, 0.56])
c = (('_a_5', '_a_6'), [0.22, 0.6])
res = [[i.split('_')[-1], j.split('_')[-1]] for (i, j), k in [a, b, c]]
# [['1', '2'], ['3', '4'], ['5', '6']]
你也可以使用str.replace
:
res = [[i.replace('_a_', ''), j.replace('_a_', '')] for (i, j), k in [a, b, c]]
按照@Ev.Kounis的建议,你也可以这样写:
res = [list(map(lambda x: x.rsplit('_', 1)[-1], k)) for k, _ in [a, b, c]]
嵌套列表推导式 require specific ordering,对某些人来说很直观,但对其他人来说却不是。上述解决方案完全避免了它们。
你很接近:
a = (('_a_1', '_a_2'), [0.3, 0.6])
b = (('_a_3', '_a_4'), [0.15, 0.56])
c = (('_a_5', '_a_6'), [0.22, 0.6])
l = [a, b, c]
[ [el.replace('_a_','') for el in tup[0]] for tup in l]
# [['1', '2'], ['3', '4'], ['5', '6']]
res=[[j.replace("_a_","") for j in i[0]] for i in l]
#OUT
[['1', '2'], ['3', '4'], ['5', '6']]
另一种方法是使用 zip
函数:
a = (('_a_1', '_a_2'), [0.3, 0.6])
b = (('_a_3', '_a_4'), [0.15, 0.56])
c = (('_a_5', '_a_6'), [0.22, 0.6])
l = [[elem[0][-1],elem[1][-1]] for elem in list(zip(a,b,c))[0]]
print(l)
输出:
[['1', '2'], ['3', '4'], ['5', '6']]
您可以使用正则表达式而不拆分它:
import re
pattern=r'[0-9]+'
print([tuple(map(lambda x:re.search(pattern,x).group(),i[0])) for i in l])
输出:
[('1', '2'), ('3', '4'), ('5', '6')]
问题
我有下一个清单:
a = (('_a_1', '_a_2'), [0.3, 0.6])
b = (('_a_3', '_a_4'), [0.15, 0.56])
c = (('_a_5', '_a_6'), [0.22, 0.6])
l = [a, b, c]
我不想要的:选择列表的第一个元组并删除 _a_
标签。
结果:
[['1','2'],['3','4'],['5','6']]
我试过的
我知道我可以使用 列表理解 来做到这一点。但我无法理解它:D 我在尝试什么:
[ el.replace('_a_','') for m in l for el in m[0]]
结果:
['1', '2', '3', '4', '5', '6']
我认为这对正确的解决方案是封闭的。只需添加如下内容:
[ [el.replace('_a_','') for m in l] for el in m[0]]
但是不行...
这是使用 str.split
的一种方法:
a = (('_a_1', '_a_2'), [0.3, 0.6])
b = (('_a_3', '_a_4'), [0.15, 0.56])
c = (('_a_5', '_a_6'), [0.22, 0.6])
res = [[i.split('_')[-1], j.split('_')[-1]] for (i, j), k in [a, b, c]]
# [['1', '2'], ['3', '4'], ['5', '6']]
你也可以使用str.replace
:
res = [[i.replace('_a_', ''), j.replace('_a_', '')] for (i, j), k in [a, b, c]]
按照@Ev.Kounis的建议,你也可以这样写:
res = [list(map(lambda x: x.rsplit('_', 1)[-1], k)) for k, _ in [a, b, c]]
嵌套列表推导式 require specific ordering,对某些人来说很直观,但对其他人来说却不是。上述解决方案完全避免了它们。
你很接近:
a = (('_a_1', '_a_2'), [0.3, 0.6])
b = (('_a_3', '_a_4'), [0.15, 0.56])
c = (('_a_5', '_a_6'), [0.22, 0.6])
l = [a, b, c]
[ [el.replace('_a_','') for el in tup[0]] for tup in l]
# [['1', '2'], ['3', '4'], ['5', '6']]
res=[[j.replace("_a_","") for j in i[0]] for i in l]
#OUT
[['1', '2'], ['3', '4'], ['5', '6']]
另一种方法是使用 zip
函数:
a = (('_a_1', '_a_2'), [0.3, 0.6])
b = (('_a_3', '_a_4'), [0.15, 0.56])
c = (('_a_5', '_a_6'), [0.22, 0.6])
l = [[elem[0][-1],elem[1][-1]] for elem in list(zip(a,b,c))[0]]
print(l)
输出:
[['1', '2'], ['3', '4'], ['5', '6']]
您可以使用正则表达式而不拆分它:
import re
pattern=r'[0-9]+'
print([tuple(map(lambda x:re.search(pattern,x).group(),i[0])) for i in l])
输出:
[('1', '2'), ('3', '4'), ('5', '6')]