【问题标题】:Creating a concatenated string of ints Python创建一个连接的整数字符串 Python
【发布时间】:2013-12-03 09:17:44
【问题描述】:

我正在遍历某个范围的数字并创建一串符合我标准的连接数字。但是,我没有得到我想要的输出。我是 python 新手,所以我可能在这里遗漏了一些东西。这是我的代码:

my_lst = []
for x in range(10):
  my_lst.append(str(x))
counter = 0
weird_num = 0
for y in range(10):
  if my_lst[y] <  5:
    weird_num = weird_num + my_lst[y]
  counter = counter + 1

print weird_num, counter

输出为0 10,我希望输出为012345 10。这个想法是我正在尝试构建这个整数字符串,所以我可能在转换时遇到问题,但我不确定。此外,由于我是新手,任何改进我的 python 代码的技巧都将不胜感激!谢谢

【问题讨论】:

  • 您正在将字符串与整数进行比较 - 您希望它如何工作?
  • 哇,这么多回复,我得花点时间整理一下。谢谢!

标签: python loops concatenation


【解决方案1】:

您的问题是您的my_lst[y] 是一个字符串,因此无法与int 进行比较。这是一些将产生您想要的输出的代码。我还添加了一些可以让你的 python 代码看起来更好的东西!

my_lst = [str(x) for x in range(10)]
weird_num = ""
for counter, y in enumerate(range(10), 1):
  if int(my_lst[y]) <=  5:
    weird_num = weird_num + my_lst[y]
print weird_num, counter

这将产生你想要的输出。

现在,让我解释一下我包含的一些部分。在1 线上,我没有创建一个空列表,然后使用 for 循环填充它,而是使用列表推导在我创建它的那一刻填充列表。有关列表推导的更多信息,请参见 here。基本上,它将一个 for 循环粘贴到填充列表的列表中的一个列表上。

接下来,我将weird_num 设为一个空列表。这样您就可以开始在 for 循环中连接 my_lst 元素。如果你用weird_num = "0" 初始化它,你的输出左边会有一个额外的零。

对于 for 循环,我使用了 enumerate,更多信息可以在 here 找到。它将你的 for 循环变成一个枚举对象,这意味着你可以在整个过程中跟踪像 counter 这样的变量。 counter 将从 0 -> 9 开始,但我添加了 1 的额外参数,使其从 1 -> 10 开始。

最后,在 for 循环中,我只需要将 my_lst[y] 转换为 int 以便您可以进行比较逻辑。

HTH

【讨论】:

  • 感谢您提供我可以改进的方法!
【解决方案2】:

您正在将字符串与整数进行比较:

if my_lst[y] < 5:

在 Python 2 中,字符串总是在数字之后排序:

>>> '1' < 5
False
>>> '9' < 5
False

因此,weird_num 仍然只是初始值,即整数 0。如果你的循环成功了,你会得到一个错误,告诉你不能连接整数和字符串

改为与字符串比较,并将weird_num 作为空字符串开始,如果您希望包含5,请测试是否小于或等于

weird_num = ''
if my_lst[y] <= '5':

或者,更简单,只需连接列表中的前 6 个值;您的列表包含从'0''9' 的数字(按排序顺序):

weird_num = ''.join(my_lst[:6])

【讨论】:

    【解决方案3】:

    weird_num 应该是一个字符串。将weird_num = 0 替换为weird_num = ""。此外,您正在将数字与字符串进行比较,这不会产生您想要的结果。

    试试这个:

    my_lst = []
    for x in range(10):
      my_lst.append(x)
    counter = 0
    weird_num = ""
    for y in range(10):
      if my_lst[y] <  5:
        weird_num = weird_num + str(my_lst[y])
      counter = counter + 1
    print weird_num, counter
    

    其他:

    您可以将counter = counter + 1 替换为counter += 1。 您可以(并且应该)将第二个 for 循环替换为:

    for y in my_lst:
      if y <  5:
        weird_num = weird_num + str(y)
      counter = counter + 1
    

    这直接迭代列表。

    连接字符串时最好使用函数str.join。一个例子:

    >>> lst = ["Hello", "world", "!"]
    >>> "...".join(lst)
    Hello...world...!
    

    你可以用这样的东西替换你的整个代码:

    my_lst = list(range(10))
    weird_num = "".join(str(i) for i in my_lst if i < 5)
    counter = len(my_list)
    

    【讨论】:

      【解决方案4】:

      你想达到什么目的?如果您只想要一个由不超过(但不包括)某个值的所有整数组成的字符串,您可以这样做:

      weird_num = "".join(str(x) for x in range(value))
      

      更详细地说,这是您的代码正在执行的操作:

      my_lst = []
      for x in range(10):
          my_lst.append(str(x))
      

      这将创建一个由十个个位数整数组成的字符串列表:['0', '1', '2', ..., '9']。在此列表中,每个项目都是其索引的字符串表示形式,即对于每个值 my_lst[x] == str(x)。这不是一个非常有用的列表,因为如果需要该字符串,您可以直接调用 str(x)

      counter = 0
      ...
      for y in range(10): 
          ...
          counter = counter + 1
      

      在整个循环中,counter == y。你只需要一个或另一个;你实际上并没有在循环中使用counter。正如您已经知道要循环多少次,您可以轻松地执行counter = 10 然后for y in range(counter),这意味着您不需要在循环内增加counter。此外,您可以在 Python 中更优雅地递增:counter += 1

      for y in range(10):
          if my_lst[y] < 5:
              ...
      

      正如其他人指出的那样,这里的问题是您将字符串与整数进行比较(您可以使用int(my_lst[y]) &lt; 5my_lst[y] &lt; str(5) 解决此问题,但正如我在上面提到的,我们已经知道my_lst[y] == str(y)

      但是,还值得强调的是,您不需要执行此检查。您可以简单地提前停止循环,因为我们已经知道列表中的项目只是每个整数的字符串表示:

      for y in range(5):
          ...
      

      【讨论】:

        【解决方案5】:

        我认为主要问题是 my_lst 包含字符串,因此“

        您可以将 my_lst 值转换回“int”以进行比较:

        my_lst = []
        for x in range(10):
          my_lst.append(str(x))
        counter = 0
        weird_num = ''
        for y in range(10):
          if int(my_lst[y]) <=  5:
            weird_num = weird_num + my_lst[y]
          counter = counter + 1
        
        print weird_num, counter
        

        其他几点:

        1. 因为奇怪的数字是作为一个字符串,你应该将它定义为字符串weird_num = ''
        2. 由于您希望输出中包含“5”,因此您需要在比较中全部为“等于”:&lt;= 5:

        【讨论】:

          猜你喜欢
          • 2020-02-27
          • 1970-01-01
          • 2013-11-20
          • 2015-06-13
          • 1970-01-01
          • 2012-07-18
          • 2011-02-20
          • 2017-10-25
          相关资源
          最近更新 更多