【问题标题】:How to unify separate digits when iterating string迭代字符串时如何统一单独的数字
【发布时间】:2020-03-12 06:47:31
【问题描述】:

我正在尝试遍历一个字符串并获取所有数字,以便我可以将它们添加到另一个任务所需的列表中。我有多个递归地相互引用的函数,原始输入是一个数据列表。问题是,当我打印字符串时,我得到了正确的输出,但是如果我遍历它并打印所有索引,我会得到单独的数字,所以 1,1 而不是 11 或 9,3 而不是 93。有人有这个问题的简单解决方案?我在编程方面不是很有经验,所以这似乎是一个简单的任务,但我现在无法弄清楚。这是我的问题部分代码。

numbers = names.split('\t')[1].split(' ')[1]
print numbers

一些输出:

8
44
46
86

现在如果我使用以下代码:

numbers = names.split('\t')[1].split(' ')[1]
for i in numbers:
    print i

我得到以下输出:

8
4
4
4
6
8
6

或者当我转换为列表时:

numbers = names.split('\t')[1].split(' ')[1]
print list(numbers)

输出:

['8']
['4', '4']
['4', '6']
['8', '6']

输入names 的结构如下:Andy Gray\t 2807 53 我还有很多名字,但它们的结构都是这样的。

然后我按\t 拆分以删除名称,然后再按' ' 拆分以获取数字。然后我有 2 个数字,并采用第二个索引来获取我想要的数字,即名称旁边的第二个数字。

我现在唯一的目标是获取“完整”数字,以便输出与我打印时一样。我需要能够以整数的形式获取这些数字的列表,其中每个索引都是完整的数字,所以[8,44,46,86] 等。然后我可以遍历这些数字并使用它们。一旦我能做到这一点,我就知​​道该怎么做,但我现在被困在这一点上。任何帮助都会很好。

链接到我正在使用的完整输入和 python 代码,以防它使事情更清楚:

Demo

【问题讨论】:

  • 等一下,您想将数字 8 44 46 86 添加到 [8,44,46,86] 这样的列表中,对吧? name的输入是什么
  • name 的输入值是多少??
  • "`numbers = names.split('\t')[1].split(' ')[1]" 能不能解释一下,尤其是最后一个split()
  • 为了更清楚一点,名称的输入是一个字符串,其中我有名称和数字,然后我删除了名称,所以我最终得到了数字。我可以发布更多代码,但我认为我的问题应该简短,因为我的目标相对简单。
  • 如果您需要更多代码来更好地理解问题,请直说。我只是想我的代码解释要简洁明了。

标签: python string loops type-conversion integer


【解决方案1】:

str.rsplit()

与 str.split() 类似,但从右端开始。

s = "Andy Gray\t 2807 53"

_, number = s.rsplit(maxsplit=1)
print(number)

【讨论】:

  • 我现在得到这样的输出:['Andy Pierre\t8441 71'] 所以这似乎不起作用。
【解决方案2】:

如果您知道所有输入的结构都相同,并且您可以保证字符串以您感兴趣的 2 位数字结尾,为什么不直接执行以下操作?

names_list = ['Andy gray\t2807 53', 'name surname\t2807 934']

for n in names_list:
  print (n[-2:])

另一方面,如果您不确定最后一个数字仅包含 2 位数字,则不需要在选项卡上进行所有拆分:

import re
names_list = ['Andy gray\t2807 53', 'name surname\t2807 94']

for n in names_list:
  try:
    if re.compile(r'.*\d+$').match(n) and ' ' in n:
      print(n.split()[-1])
  except:
    pass

【讨论】:

  • name surname\t2807 994 测试这个
  • 是的,它的工作,所以我赞成它。我不知道OP。
  • 它不起作用。 def process_names(names): names_list = list(names) for n in names_list: print (n.split()[-1]) 我得到一个错误:IndexErrorR e n e: list index out of range
  • 这只是意味着并非所有字符串都按照您的预期进行格式化:) 您可以添加一个 try/catch 来跳过字符串中没有空格的情况(这种情况正在发生你这个错误)
  • @FrustratedDeveloper 你用我给你链接的代码和输入文件试过了吗?
【解决方案3】:

EDIT阅读OP添加的代码后

代码看起来不错,但问题是我的输入(名称)不是字符串列表。我有一个这样的字符串:Guillaume van Steen 5855 5 Sven Silvis Cividjian 1539 88 Jan Willem Swarttouw 3911 66 更进一步。这就是为什么我在制表符和空格处拆分以获得最终数字。

也许这段代码有帮助:

from pathlib import Path

file = Path('text.txt')
text = file.read_text()

这里是按行分割文件:

lines = text.split('\n')

所以可以使用添加一点检查的功能

def get_numbers(list_of_strings):
        numbers = list()
        for string in list_of_strings:
            # here check if the line has a "\t" so asume is a valid line
            if '\t' in string:
                numbers.append(int(string.split()[-1]))
        return numbers

numbers = get_numbers(lines)
print(numbers)

【讨论】:

  • 代码看起来不错,但问题是我的输入(名称)不是字符串列表。我有一个这样的字符串:Guillaume van Steen 5855 5 Sven Silvis Cividjian 1539 88 Jan Willem Swarttouw 3911 66 更进一步。这就是为什么我在制表符和空格处拆分以获得最终数字。
【解决方案4】:

您可以再次用空格分割字符串并将每个值转换为 int。 例如,

numbers = names.split('\t')[1].split(' ')[1]
list_numbers = [int(x) for x in numbers.split(' ')]

然后您将获得“完整”数字列表

【讨论】:

  • 你能解释一下吗??
  • 根据问题编号是一个字符串“8 44 46 86 ...”,期望的结果是一个整数列表[8,44,46,86 ...]。此代码按空格分割字符串并将每个元素转换为整数。
  • 这行不通,因为它已经去掉了空格,每个数字都打印在单独的行上。我已更改问题以使其更清楚。
  • 好的,你能给@PervySage 的名字提供一个样本值吗
  • 是的,名称的示例值的结构如下:Andy gray 2807 53 然后我按制表符拆分以获取数字,然后再次按空格以获取单个数字。
猜你喜欢
  • 2019-07-15
  • 2010-09-19
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2020-06-20
相关资源
最近更新 更多