【问题标题】:How to extract numbers from a list of strings?如何从字符串列表中提取数字?
【发布时间】:2017-03-11 12:13:53
【问题描述】:

我应该如何只从

中提取数字
a = ['1 2 3', '4 5 6', 'invalid']

我试过了:

mynewlist = [s for s in a if s.isdigit()]
print mynewlist

for strn in a:
    values = map(float, strn.split())
print values

两个都失败了,因为数字之间有空格。

注意:我试图实现输出为:

[1, 2, 3, 4, 5, 6]

【问题讨论】:

  • 数字是否仅由空格分隔,或者您认为可能还有其他内容,例如逗号或其他内容?
  • 你用values = map(float, strn.split())得到了什么?
  • @Dunno:是的,它们用空格而不是逗号分隔
  • @levi 我得到 ValueError: could not convert string to float: invalid
  • 在这种情况下并不重要,因为你的代码为什么不工作是显而易见的,但你应该养成包含完整堆栈跟踪和代码如何失败的详细描述的习惯你的问题。当您在将来询问有关更复杂问题的 SO 问题时,说您的代码“失败”可能会导致一个封闭的问题,因为它不够详细。

标签: python string python-2.x


【解决方案1】:

我认为您需要将list 中的每个项目作为空格上的拆分字符串处理。

a = ['1 2 3', '4 5 6', 'invalid']
numbers = []
for item in a:
    for subitem in item.split():
        if(subitem.isdigit()):
            numbers.append(subitem)
print(numbers)

['1', '2', '3', '4', '5', '6']

或者在简洁的理解中:

[item for subitem in a for item in subitem.split() if item.isdigit()]

【讨论】:

    【解决方案2】:

    这应该适用于您的特定情况,因为您在列表中包含了一个字符串。因此,您需要将其展平:

    new_list = [int(item) for sublist in a for item in sublist if item.isdigit()]
    

    【讨论】:

    • 对于像 ['25 33 48'] 这样的输入,这会产生像 [2, 5, 3, 3, 4, 8] 这样的输出
    【解决方案3】:

    假设列表只是字符串:

    [int(word) for sublist in map(str.split, a) for word in sublist if word.isdigit()]
    

    【讨论】:

      【解决方案4】:

      sets 的帮助下,您可以:

      >>> a = ['1 2 3', '4 5 6', 'invalid']
      >>> valid = set(" 0123456789")
      >>> [int(y) for x in a if set(x) <= valid for y in x.split()]
      [1, 2, 3, 4, 5, 6]
      

      这将包括字符串中的数字如果字符串由来自valid 集合的字符组成。

      【讨论】:

      • @eugene y:现在可以了!!感谢您的审查努力! :)
      【解决方案5】:

      一个班轮解决方案:

      new_list = [int(m) for n in a for m in n if m in '0123456789']
      

      【讨论】:

        【解决方案6】:
        mynewlist = [s for s in a if s.isdigit()]
        print mynewlist
        

        不起作用,因为您正在迭代数组的内容,该数组由三个字符串组成:

        1. '1 2 3'
        2. '4 5 6'
        3. '无效'

        这意味着您必须在每个字符串上再次迭代。

        你可以试试

        mynewlist = []
        for s in a:
            mynewlist += [digit for digit in s if digit.isdigit()] 
        

        【讨论】:

        • 您应该避免在具有列表的变量名称中使用“数组”一词。数组和列表是不同的数据结构,具有不同的属性和能力。
        • 有使用它的早期版本吗?因为它现在不存在,也不存在于问题修订历史记录中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        • 2022-12-20
        • 2012-05-03
        相关资源
        最近更新 更多