【问题标题】:Converting specific elements in a list of lists from a string to an integer [duplicate]将列表列表中的特定元素从字符串转换为整数[重复]
【发布时间】:2017-02-21 19:53:56
【问题描述】:

我有一个结构化的列表列表,其中每个元素都是一个字符串。我想将此列表列表中的某些(已知索引,始终相同)元素转换为整数。我尝试过使用列表理解或isdigit() 方法(没有负面元素),但无法弄清楚。

list_of_lists = [['spam','1','toast'], ['bacon','5','eggs'], ['juice', '8', 'tea']]
new_breakfast_list = [[int(element) for element in row] for row in list_of_lists]

上面的代码在尝试转换第一个元素时可以理解地给出ValueError: invalid literal for int() with base 10: 'spam'。我想要么忽略错误并继续前进到下一个元素,要么可能专门循环遍历 list_of_lists[i][1] 之类的东西,这样我就可以得到:

print(new_breakfast_list)
[['spam', 1, 'toast'], ['bacon', 5, 'eggs'], ['juice', 8, 'tea']]

【问题讨论】:

  • 使用字典列表而不是列表列表怎么样?您的内部元素似乎是结构化的,这将更适合使用字典甚至创建一个类。
  • 要转换的元素是否总是在每个列表的相同位置?
  • 是的,使用类或字典可能更合适。

标签: python python-3.x


【解决方案1】:

您的列表理解几乎是正确的,您只需要在内部循环中使用isdigit() 进行检查,然后根据isdigit 的值使用int(element) 或仅使用element

new_breakfast_list = [[int(element) for element in row if element.isdigit() else element] for row in list_of_lists]

或者,您知道整数元素出现在索引1,您可以使用:

for element in list_of_lists:
    element[1]=int(element[1])

由于您知道要更改的索引,因此您应该使用此方法,因为它可以避免不必要地循环遍历每个元素。

【讨论】:

  • 同意这一点:如果您确定每个内部列表都有 3 个元素,那么为什么要遍历它们……只需索引它们。 (也许这不是 Pythonic?)
  • for 循环可能是最简单的方法。并非所有问题都必须通过列表理解来解决。
  • 我对调用正确的元素感到困惑,我需要一个两位数的索引,例如print(list_of_lists[1]) 提供 ['bacon', 5, 'eggs'] 而不是 5。如果你把它写成for row in list_of_lists: \n row[1]=int(row[1]) 这对我来说更有意义。非常感谢您的帮助!
  • 在循环之外,您需要list_of_lists[x][1] 来获得所需的元素,因为list_of_lists 是二维的。然而,在循环中,element 是一个列表,例如在第一次迭代中,element 将是['spam', 1, 'toast']。由于这只是一个一维列表,您只需使用 element[1] 对其进行索引
  • 试试new_lunch_list
【解决方案2】:

由于您处理的是正整数,因此您可以检查字符串中是否只有数字,并使用三进制进行转换。

list_of_lists = [['spam','1','toast'], ['bacon','5','eggs'], ['juice', '8', 'tea']]
new_breakfast_list = [[int(element) if element.isdigit() else element for element in row] for row in list_of_lists]

产量:

[['spam', 1, 'toast'], ['bacon', 5, 'eggs'], ['juice', 8, 'tea']]

虽然有 2 个缺点:

  • 它会尝试转换所有项目,即使只有第二个是整数
  • 它不处理底片(如果你需要的话)

注意:有一种繁琐/不那么高效的方式来处理一般的正/负/以空间整数开头的情况,只在你必须使用的情况下使用它!否则,try/except 的 wim 答案会更好

new_breakfast_list = [[int(element) if element.strip().isdigit() or (element.strip()[0]=="-" and element.strip()[1:].isdigit()) else element for element in row] for row in list_of_lists]

【讨论】:

  • isdigit 是检查int(element) 是否有效的不好方法。
  • 同意,但在这种情况下,您要处理的元素数量不能为负数,否则我不会回答这个问题。
  • 好的,我错过了。删除了反对票。
  • 很公平。我知道没有简单的方法来处理列表推导中的负/正而不会使它们过于复杂......
【解决方案3】:

只要定义你自己的小辅助函数,像这样简单:

def maybe_int(val):
    try:
        return int(val)
    except ValueError:
        return val

现在你可以在任何你想要的理解中使用它。在使用str.isdigit 检查失败的某些情况下(例如字符串中的空格、负数等),它将继续工作。

如果数据的结构是可靠的,那么就不要理会这些东西了。只需做一个简单的 list-comp:

>>> [[x, int(n), y] for x, n, y in list_of_lists]
[['spam', 1, 'toast'], ['bacon', 5, 'eggs'], ['juice', 8, 'tea']]

【讨论】:

  • 你应该重新添加关于负数的部分。大多数人忽略了这部分,你的函数看起来很麻烦。
  • 好的,添加回来了。
  • 您的 listcomp 很好,因为它不会尝试转换其他项目。
猜你喜欢
  • 2012-05-08
  • 2021-07-26
  • 2018-05-07
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多