使用for循环引用列表中的每一项(而不仅仅是最后一项)



我不知道如何在使用for循环时引用列表中的每个项,而不是只引用最后一个项。这里有一个简单的程序,我想在一行上打印一个n-*,其中n是stars列表中的每个数字。这是我的代码:

#!/usr/bin/python
def histogram():
    stars = [10,2,3]
    for i in stars:
        char = "*" * i
    return char
print histogram()

该代码的输出仅为***stars中的最后一个数字)。我怎样才能打印出每个数字的星号?请尽可能使用最简单的语法和解释。

实际上,函数只返回分配给"char"的最后一个值——这个值将是一个由星号组成的字符串。您想做的是创建一个连续值的列表,"char"在循环的每次迭代中都会取这些值:

def histogram():
    stars = [10,2,3]
    characters = []
    for i in stars  :
        cur_stars = "*" * i 
        characters.append( cur_stars )
        print cur_stars
    return characters
>>> stars = histogram()
**********
**
***

上面将逐行打印出星星,并将列表存储为变量"星星"。

做同样事情的一种更快/更干净的方法是列表理解(一种函数式编程结构),它可以动态创建列表:

def histogram():
    stars = [10,2,3]
    return [ "*" * i  for i in stars ]
>>> histogram()
['**********', '**', '***']
>>> print('n'.join( histogram() ))
**********
**
***

问题是,对于stars中的每个项目,都要重新分配char。因此,当histogram()返回时,char等于"*" * stars[-1](列表中的最后一项)。纠正这种情况的最简单方法是只为stars中的每个元素打印char,而不返回任何内容。

def histogram():
    stars = [10,2,3]
    for i in stars:
        char = "*" * i
        print char
histogram()

**********
**
***

如果您想返回直方图的输出,可以将其添加到char,而不是将其分配给新值。为此,我们在for循环外将char设置为空字符串(''),然后在for循环内使用char +=(相当于char = char +)添加到char'n'是在stars中的每个项目之间添加一个新行(如果没有它,所有的星都将在输出中的一行上)。

def histogram():
    stars = [10,2,3]
    char = ''
    for i in stars:
        char += "*" * i + 'n'
    return char
print histogram()

写上述内容的一种更简洁的方式是:

def histogram():
    stars = [10,2,3]
    return 'n'.join('*' * i for i in stars)
print histogram()

考虑:

def histogram(li):
    rtr=[]
    for n in li:
        rtr.append('*'*n)
    return rtr

然后你可以做一些类似的事情:

stars=[10,2,3]
for t in zip(stars, histogram(stars)):
    print('{:4d} {}'.format(*t))

打印:

  10 **********
   2 **
   3 ***
#!/usr/bin/python
def histogram():
    stars = [10,2,3]
    stars_str = ""
    for i in stars  :
        stars_str += "*" * i + 'n'
    return stars_str.strip()

print histogram ()

最新更新