对多维列表的特定元素使用拆分
Use split for specific elements of multidimensional list
我有以下列表(实际文件更大更复杂)
a = [[['3x5'], ['ff']], [['4x10'], ['gg']]]
我想对列表中的第一个元素使用拆分功能,并获取出现在 "x" 之后的值。在这种情况下,最终结果应该是 5 和 10。我尝试以这种格式使用 split
for line in a:
print str(line[0]).split("x")[1]
但输出是
5']
10']
我知道我可以轻松地操纵输出以获得 5 和 10,但在这种情况下使用 split 的正确方法是什么?
而且我有兴趣对列表的特定元素(在本例中为第一个元素)使用拆分。
您需要更深入地研究,不要在列表中使用 str()。
>>> a = [[['3x5'], ['ff']], [['4x10'], ['gg']]]
>>> for y in a:
... if 'x' in y[0][0]:
... print y[0][0].split('x')[-1]
5
10
您不应该将列表设为字符串对象,但是,您可以使用:
>>> [i[0][0].split('x')[1] for i in a]
['5', '10']
我想你也想将输出转换为 int 对象,那么你可以简单地添加一个 int()
,如下所示:
>>> [int(i[0][0].split('x')[1]) for i in a]
[5, 10]
但是,如果您不需要将输出保存到列表中,而是将其打印出来,您可以使用相同的代码,但编写另一个版本:
a = [[['3x5'], ['ff']], [['4x10'], ['gg']]]
for i in a:
print(i[0][0].split('x')[1])
输出:
5
10
请记住,当 a
是...时,我的代码将失败(引发 IndexError: list index out of range
)...例如 [[['3x5'], ['ff']], [['kk'], ['gg']]]
(其中一个子列表中的第一个元素不符合格式像 '3x5'
).
然而,一个简单的 if
可以解决这个问题:
>>> a = [[['3x5'], ['ff']], [['kk'], ['gg']]]
>>> [int(i[0][0].split('x')[1]) for i in a]
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 1, in <listcomp>
IndexError: list index out of range
>>> [int(i[0][0].split('x')[1]) for i in a if 'x' in i[0][0]]
[5]
或者更好的是,使用 RegEx 来检查,这样可以避免类似 a = [[['3x5'], ['ff']], [['xxxxxxx'], ['gg']]]
:
>>> import re
>>> a = [[['3x5'], ['ff']], [['xxxxxxx'], ['gg']]]
>>> [int(i[0][0].split('x')[1]) for i in a if re.search(r'\d+x\d+', i[0][0])]
[5]
另一种方式,如果你不想import re
:
>>> [int(i[0][0].split('x')[1]) for i in a
... if all(j.isdigit() for j in i[0][0].split('x'))]
[5]
我有以下列表(实际文件更大更复杂)
a = [[['3x5'], ['ff']], [['4x10'], ['gg']]]
我想对列表中的第一个元素使用拆分功能,并获取出现在 "x" 之后的值。在这种情况下,最终结果应该是 5 和 10。我尝试以这种格式使用 split
for line in a:
print str(line[0]).split("x")[1]
但输出是
5']
10']
我知道我可以轻松地操纵输出以获得 5 和 10,但在这种情况下使用 split 的正确方法是什么?
而且我有兴趣对列表的特定元素(在本例中为第一个元素)使用拆分。
您需要更深入地研究,不要在列表中使用 str()。
>>> a = [[['3x5'], ['ff']], [['4x10'], ['gg']]]
>>> for y in a:
... if 'x' in y[0][0]:
... print y[0][0].split('x')[-1]
5
10
您不应该将列表设为字符串对象,但是,您可以使用:
>>> [i[0][0].split('x')[1] for i in a]
['5', '10']
我想你也想将输出转换为 int 对象,那么你可以简单地添加一个 int()
,如下所示:
>>> [int(i[0][0].split('x')[1]) for i in a]
[5, 10]
但是,如果您不需要将输出保存到列表中,而是将其打印出来,您可以使用相同的代码,但编写另一个版本:
a = [[['3x5'], ['ff']], [['4x10'], ['gg']]]
for i in a:
print(i[0][0].split('x')[1])
输出:
5
10
请记住,当 a
是...时,我的代码将失败(引发 IndexError: list index out of range
)...例如 [[['3x5'], ['ff']], [['kk'], ['gg']]]
(其中一个子列表中的第一个元素不符合格式像 '3x5'
).
然而,一个简单的 if
可以解决这个问题:
>>> a = [[['3x5'], ['ff']], [['kk'], ['gg']]]
>>> [int(i[0][0].split('x')[1]) for i in a]
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 1, in <listcomp>
IndexError: list index out of range
>>> [int(i[0][0].split('x')[1]) for i in a if 'x' in i[0][0]]
[5]
或者更好的是,使用 RegEx 来检查,这样可以避免类似 a = [[['3x5'], ['ff']], [['xxxxxxx'], ['gg']]]
:
>>> import re
>>> a = [[['3x5'], ['ff']], [['xxxxxxx'], ['gg']]]
>>> [int(i[0][0].split('x')[1]) for i in a if re.search(r'\d+x\d+', i[0][0])]
[5]
另一种方式,如果你不想import re
:
>>> [int(i[0][0].split('x')[1]) for i in a
... if all(j.isdigit() for j in i[0][0].split('x'))]
[5]