【问题标题】:Replacing a list in a program with a tuple?用元组替换程序中的列表?
【发布时间】:2013-10-22 11:52:59
【问题描述】:

目前,我正在研究我的 Python 2 书中的一组练习,但遇到了一个问题。以下是问题:

“5.1 - 编写一个程序,从用户那里读取数字列表;当用户输入 0 时,列表终止。在所有输入之后,程序应该打印列表。” p>

我对5.1的回答如下:

def main():
    L = []
    done = False
    while not done:
        num = input( "Enter a number: " )
        if num == 0:
            for i in L:
            print i
            done = True
        else:
            L.append(num)

main()

问题在于练习 5.2,它要求:

“5.2 - 更改程序 (5.1) 以使用元组而不是列表。”

这甚至可能吗?我的印象是元组是不可变的,所以它们真的不能用来代替这里的列表。我对吗?我疯了吗?我的 Python 书疯了吗?我在这里完全错过了关于元组的东西吗?帮助...

【问题讨论】:

  • 可能练习只是想展示元组的等效用法,以及两种情况下的代码有何不同。虽然你不能改变一个元组,但你可以在每次想要追加的时候创建一个新的元组。
  • 提示:数字也是不可变的,i = i + 5 仍然有效...
  • 当然,给定的元组是不可变的,但您仍然可以对其执行操作。不同之处在于,对于可变结构(如列表),操作将更改列表,而对于不可变结构(如元组),操作将返回一个新的元组。 (不过,对可变数据结构的一些操作仍会返回新的数据结构。)

标签: python list input tuples


【解决方案1】:

你不能修改一个元组,但是你可以通过合并两个元组来创建一个新的元组:

>>> tup = ()
>>> tup += (1,)
>>> tup
(1,)
>>> tup += (2,)
>>> tup
(1, 2)

【讨论】:

  • 太棒了,无论出于何种原因,我的书都没有提到可以以这种方式组合元组。
【解决方案2】:

您可以简单地将+ 运算符用于元组。

>>> t = ()
>>> t += (9,)
>>> t
(9,)
>>> t += (3,)
>>> t
(9, 3)

你可以用不同的方式初始化一个元组:

a = () # 0-tuple (empty tuple)
b = (item,) # 1-tuple (note the trailing comma)
c = item, # 1-tuple (note the trailing comma)

我会这样写你的函数:

def main():
    l = ()
    num = None
    while num != 0:
        num = input("Enter a number: ")
        if num == 0:
            for i in l:
                print i
        else:
            l += (num,)

main()

【讨论】:

    【解决方案3】:

    这可能是练习认为你不应该通过一次添加一个元素来构建元组,事实上,你可以通过一些隐式循环来完成这一切:

    def get_some_input():
        return input("Enter a number: ")
    
    def main():
        T = tuple(iter(get_some_input, 0))
    
        for i in T:
            print i
    

    注意我们没有写

    T = tuple(iter(get_some_input(), 0))
    #                            ^^
    

    我们希望将get_some_input 函数传递给iter,而不是调用它的结果。 iter 会反复为我们调用这个函数,直到它得到一个0

    我们也可以这样写:

    def main():
        T = iter(get_some_input, 0)
    
        for i in T:
            print i
    

    没有tuple()。不同之处在于我们不会在开始 for 循环之前消耗所有 iter(...)

    【讨论】:

    • 我今天从中学到了一些新东西。不过,我仍然希望我的答案能够获胜:P 谢谢丹。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多