创建一个连贯的Python字符串

时间:2013-11-19 17:26:10

标签: python loops concatenation

我正在迭代一些数字并创建一串符合我标准的连接数字。但是,我没有得到我想要的输出。我是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代码的技巧都会受到赞赏,因为我是新手!感谢

5 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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循环填充它,我使用列表理解来填充列表我做的一分钟。有关list comprehensions的更多信息,请访问here。基本上,它将一个for循环粘贴到填充列表的列表中的一个列表中。

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

对于for循环,我使用了enumerate,可以找到更多信息here。它将你的for循环变成一个枚举对象,这意味着你可以通过整个事物跟踪counter之类的变量。 counter将从0开始 - > 9,但我添加了1的额外参数,以便它将从1 - &gt; 10。

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

HTH

答案 2 :(得分:1)

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)

答案 3 :(得分:1)

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

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]) < 5my_lst[y] < str(5)来解决这个问题,但正如我在上面所说,我们已经知道{ {1}}。

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

my_lst[y] == str(y)

答案 4 :(得分:0)

我认为主要的问题是my_lst包含字符串,因此“&lt; 5”比较无效(此比较不符合您的想法)。

您可以将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用作字符串,因此您应将其定义为字符串weird_num = ''
  2. 由于您希望输出中包含“5”,因此您需要在比较中使用“等于”全部:<= 5: