【问题标题】:Python: Can not multiply sequence by non-int of type 'str':: Separating characters from number from input dataPython:不能将序列乘以“str”类型的非整数::将字符与输入数据中的数字分开
【发布时间】:2022-01-17 03:13:53
【问题描述】:

我有一个输入字符串,每个元素都有一个数字和字符,我想分别访问每个元素的数字和字符,如下所示:

1s-2r,3d*3 # this is the line in the input file: # this stars means repeated three time 

所以我想让一个数组只包含数字:

number_only=[1,2,3,3,3] # numpy 
s=[s,r,d,d,d] # another array string characters only 

但是我得到了以下错误“TypeError: can't multiply sequence by non-int of type 'str'”.. 我知道这应该是一个整数,但我不知道该怎么做,附上的是试用码

import numpy as np
with open('dataa.dat', 'r') as f:
     input_data = f.readlines()
     input_data = [(d+' ')[:d.find('#')].rstrip() for d in input_data]
x   =          input_data[0].split('-')
y =          []

for elt in x:
    if "*" in elt:
        n, mult        = elt.split("*")
        y        = y + [(n)] * (mult)
    else:
        y+=[ii for ii in elt.split(',')]
number_only        =          np.array(y)
#s

【问题讨论】:

  • 您是在问如何将字符串转换为int
  • @ScottHunter 谢谢你的关心,实际上,我对基于重复值的星号后面的数字感兴趣,然后单独的值,

标签: python arrays string


【解决方案1】:

使用正则表达式的简单方法是:

import re

string = "1s-2r,3d*3"
numbers = re.findall(r"[0-9]", string)
letters = re.findall(r"[a-zA-Z]", string)

然后将数字从str转换为int:

numbers = [int(i) for i in numbers]

编辑:

应该这样做

def parse_string_to_numbers_letters(string):
    string_parts = re.split(r",|-", str(test))
    aggregated_string = ""
    for string in string_parts:
        if re.search("\*", string):
            to_be_multipled = string.split("*")[0]
            multiplier = string.split("*")[1]
            string = to_be_multipled * int(multiplier)
        aggregated_string +=string
    numbers = re.findall(r"[0-9]", aggregated_string)
    letters = re.findall(r"[a-zA-Z]", aggregated_string)
    return numbers, letters

【讨论】:

  • 感谢您的评论,但是,如果我这样做,我将无法包含星号来重复数字和字符串的值
  • 啊,我误解了你的问题,1s-2r,3d*3 的计算结果是“1s-2r,3d1s-2r,3d1s-2r,3d”吗?
  • 再次感谢您,这意味着/应该是 1s-2r,3d,3d,3d" 最终答案应该是数字数组 =[1 2 3 3 3] string= [srddd]
  • 没问题——每一行的格式都一样吗?尝试发布前 10 行,以便我们查看发生了什么并检查格式是否相对稳定。
  • 不确定我是否理解你所说的,但字母或数字可能会改变,但星星总是一样的重复
【解决方案2】:

这会从字符串中返回数字:

only_digits = ''.join(i for i in string if i.isdigit())

【讨论】:

  • 谢谢您的关心,但是,我怎么能包含repeat :: 如何使这个1s-2r,3d*3 为1s-2r,3d,3d,3d 然后[1,2, 3,3,3] 和 [s,r,d,d,d] 再次感谢您!!
  • 没问题,让我知道它是否有效!
【解决方案3】:

你可以试试这个:

import re

def split_string(pat):
    numbers = []
    letters = []

    for s in re.split(r"[,-]", pat):
        count = 1
        if len(s) > 2:
            assert s[2] == '*'
            count = int(s[3:])
        numbers += [int(s[0])] * (count)
        letters += [s[1]] * (count)

    return numbers, letters

def main():
    # The two examples from the question and the comments
    numbers, letters = split_string("1s-2r,3d*3")
    assert numbers == [1,2,3,3,3]
    assert letters == ['s','r','d','d','d']

    numbers, letters = split_string("1s,2e*3-2q*2,1u")
    assert numbers == [1,2,2,2,2,2,1]
    assert letters == ['s', 'e', 'e', 'e', 'q', 'q', 'u']


if __name__ == '__main__':
    main()

【讨论】:

  • 能否解释一下 if__name__=='main' 部分的含义
  • 它似乎工作得很好,但是,如果数字是 11 或 20 或两个元素,它会返回以下错误 "in split_string assert s[2] == '*' AssertionError" 所以有没有一种处理方法??
  • 这些问题只涉及一位数字。您是否期望任何(整数)数字作为第一个元素?
猜你喜欢
  • 2019-04-12
  • 2013-07-03
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2019-09-07
  • 1970-01-01
相关资源
最近更新 更多