【问题标题】:Modify lists within lists using list comprehension [duplicate]使用列表理解修改列表中的列表[重复]
【发布时间】:2017-06-05 04:28:19
【问题描述】:

所以。我有一个包含列表的列表

>>> f[:10]
[['-340', '495', '-153', '-910', '835', '-947'], ['-175', '41', '-421', '-714', '574', '-645'], ['-547', '712', '-352', '579', '951', '-786'], ['419', '-864', '-83', '650', '-399', '171'], ['-429', '-89', '-357', '-930', '296', '-29'], ['-734', '-702', '823', '-745', '-684', '-62'], ['-971', '762', '925', '-776', '-663', '-157'], ['162', '570', '628', '485', '-807', '-896']]

我想将主列表中每个列表中的每个值更改为 int。换句话说,我想结束这个

>>> f[:10]
[[-340, 495, -153, -910, 835, -947], [-175, 41, -421, -714, 574, -645], [-547, 712, -352, 579, 951, -786], [419, -864, -83, 650, -399, 171], [-429, -89, -357, -930, 296, -29], [-734, -702, 823, -745, -684, -62], [-971, 762, 925, -776, -663, -157], [162, 570, 628, 485, -807, -896]]

现在,我可以使用以下代码轻松做到这一点:

for x in range(len(f)):
    for y in range(6):
        f[x][y] = int(f[x][y])

但我想知道是否可以使用列表推导来做到这一点。我尝试了以下代码

f = [int(x) for y in f for x in y]

但这会导致一个大列表

>>> f[:10]
[-340, 495, -153, -910, 835, -947, -175, 41, -421, -714]

任何人都知道如何使用列表理解来完成所需的结果?

【问题讨论】:

  • 那是因为您使用的是嵌套列表理解。转换子列表中的项目,而不是像[[int(x) for x in sub] for sub in f]
  • @Kasramvd 正是我想要的,谢谢。

标签: python list python-3.x list-comprehension


【解决方案1】:

f 作为起始列表,使用嵌套推导:

>>> import pprint
>>> result = [[int(x) for x in l] for l in f]
>>> pprint.pprint(f)
[['-340', '495', '-153', '-910', '835', '-947'],
 ['-175', '41', '-421', '-714', '574', '-645'],
 ['-547', '712', '-352', '579', '951', '-786'],
 ['419', '-864', '-83', '650', '-399', '171'],
 ['-429', '-89', '-357', '-930', '296', '-29'],
 ['-734', '-702', '823', '-745', '-684', '-62'],
 ['-971', '762', '925', '-776', '-663', '-157'],
 ['162', '570', '628', '485', '-807', '-896']]
>>> pprint.pprint(result)
[[-340, 495, -153, -910, 835, -947],
 [-175, 41, -421, -714, 574, -645],
 [-547, 712, -352, 579, 951, -786],
 [419, -864, -83, 650, -399, 171],
 [-429, -89, -357, -930, 296, -29],
 [-734, -702, 823, -745, -684, -62],
 [-971, 762, 925, -776, -663, -157],
 [162, 570, 628, 485, -807, -896]]

或者listmap

>>> result = [list(map(int, l)) for l in f]
>>> pprint.pprint(result)
[[-340, 495, -153, -910, 835, -947],
 [-175, 41, -421, -714, 574, -645],
 [-547, 712, -352, 579, 951, -786],
 [419, -864, -83, 650, -399, 171],
 [-429, -89, -357, -930, 296, -29],
 [-734, -702, 823, -745, -684, -62],
 [-971, 762, 925, -776, -663, -157],
 [162, 570, 628, 485, -807, -896]]

【讨论】:

  • OP 说他们想修改现有的列表,而不是建立一个新的;当然可以分配给f[:]
  • @Chris_Rands - 他们显然可以制作一个新的:f = [int(x) for y in f for x in y] 在问题中。
  • 也许吧,但他们的for 循环确实修改了现有列表。如果他们想要一个新列表,那完全是……stackoverflow.com/questions/18072759/…
  • @Chris_Rands - 很好的发现,谢谢。
【解决方案2】:

为此,您需要nested list comprehension。试试:

[[int(x) for y in f] for x in y]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 2016-10-26
    • 1970-01-01
    • 2017-08-06
    • 2013-01-26
    • 2019-04-05
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多