如何正确地将此字符串转换为整数?

时间:2019-07-10 22:46:08

标签: python-3.x

我希望能够获取列表中的值,并验证其是否为字符串中的整数,然后将其转换为整数并删除非整数的任何内容,然后返回列表。

我已经尝试过isinstance(),但无法正常工作,我还尝试将它们转换为差异类型,但这没用。

def turnListToInt(lst):
    for i in lst:
        if lst[i].isdigit():
            int(lst[i])
        else:
            del lst[i]


def askQuestion():
    ask = input("How may I help you?")
    if ask == "":
        print("Thats Not A Valid Question")
    elif ask == "Multiply" or "multiply" or "*":
        ask = input("What Numbers?")
        numbers = ask.split();
        numbers = turnListToInt(numbers)
        print(float(numbers[0])*float(numbers[1]))
while run:
    askQuestion();

我希望list = [“ 2”,“ and”,“ 5”]变成list = [2,5]。

2 个答案:

答案 0 :(得分:1)

这应该是技巧:

def turn_list_to_int(lst):
    return [int(v) for v in lst if v.isdigit()]


test = ["2", "and", "5"]
print(turn_list_to_int(test))

输出

[2, 5]

此代码基本上只用数字值构造一个新列表(使用list comprehension),并将它们转换为整数(忽略所有其他值)。

您的解决方案有多个问题,即:

  1. 您的ilst中的项目,而不是索引。这是因为使用符号for i in lst时要遍历列表。如果您想在那里建立索引,正确的方法是像这样:for i in range(len(lst))
  2. 您在lst中突变了turnListToInt,但是您没有返回列表。
  3. int(lst[i])是无用的(假设ilst的索引,不在您的代码中),您正在将lst的元素转换为int,您实际上并不会将该值存储在任何地方,例如:lst[i] = int(lst[i])会更有意义。
  4. 当您使用for循环和索引遍历列表时,由于最初的意图是使列表发生突变,因此当您同时从列表中删除项目时,for循环有时会尝试访问不包含元素的元素之所以可以在列表中使用,是因为您的列表会由于删除元素而缩小,并且索引将超出缩小列表的范围。

答案 1 :(得分:0)

您的turnListToInt几乎是正确的。按照书面说明,它不会返回任何内容,因此您应确保返回任何内容。

此外,当您执行for i in lst时,i是列表中的每个项目。如果需要索引,可以使用方便的Python函数enumerate,该函数将返回索引和项目。

但是,在这种情况下,我们不需要索引。我建议构造一个全新的列表,并仅在有数字时才附加到列表:

def turnListToInt(lst):
    newlist = []
    for item in enumerate(lst):
        if item.isdigit():
            newlist.append(int(item))

    return newlist


def askQuestion():
    ask = input("How may I help you? ")
    if ask == "":
        print("Thats Not A Valid Question")
    elif ask == "Multiply" or "multiply" or "*":
        ask = input("What Numbers? ")
        numbers = ask.split();
        numbers = turnListToInt(numbers)
        print(float(numbers[0])*float(numbers[1]))
while True:
    askQuestion();

另一建议是尝试在交互式控制台(命令行)中运行代码。这样,您可以立即看到结果。另外,调试代码时,您可以添加许多print语句。您可以print几乎可以使用任何变量或对象,并且可以获得更多信息。

更新

@Rafael正确地指出,在迭代过程中直接编辑lst不是一个好主意。碰巧的是,我的代码的先前版本可用于“ 2和5”输入。相反,我创建了一个新列表并将其追加到列表中。另一种解决方案是枚举列表的反向版本,这样就不会混淆删除的索引。