pythonic方式使用循环列表

时间:2016-02-20 20:13:44

标签: python-3.x

我有一个列表,例如:

[1,2,3,4,5,6,7,8,9,10]

用户说了一个号码,例如16号。然后程序需要在第16个号码上回复号码。这里,如果数字大于列表的长度,你必须在列表的开头继续计数。打印完该元素后,必须将其从列表中删除。然后用户必须再次选择一个新的数字来执行此过程,但程序需要从结束的位置开始计数。如果所选数字为7,则需要从位置6开始添加7个位置。必须在新列表上重复此过程,直到它为空。

这是我到目前为止所拥有的。

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
i = 0
position = 0

while i < len(my_list):
    position += number
    print(my_list[position])
    my_list.pop(position)
    i += 1
    number = int(input())

问题是主要的问题是找到一个好的方法来打印列表中某个位置的数字。

2 个答案:

答案 0 :(得分:1)

我想如果你想要第16个项目那就是7个? 0索引和所有这些。如果是这样,那么我认为这是一个很好的简单解决方案:

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
while(len(my_list) > 1):
    number = int(input("number:"))
    index = 0;
    number += index
    while(number >= len(my_list)):
        number = number % len(my_list)
    index = number
    print(my_list[number])
    my_list.pop(index)

如果你确实想要数字6那么只需将编号调整为1就可以了。 显然,这可以通过多种方式得到改善。我建议您使用@Blckknght提供的解决方案,它更简洁,避免突变。

答案 1 :(得分:1)

另一个答案很好,但这里有一个更简洁的替代解决方案。而不是使用list.pop从列表中间删除项目(然后需要跟踪我们从中删除它的位置),而是在每次查找后使用两个切片操作重建列表,以便我们删除的项目之后的项目将位于列表的开头。作为一个很好的副作用,我们不再改变初始列表。

my_list = list(range(1, 11))
while my_list:  # no need for len(lst) > 0 here, list are falsey when empty
    index = int(input()) % len(my_list)  # get index from the user, wrap if necessary
    print(my_list[index])                # print out the value at the requested index
    my_list = my_list[index+1:] + my_list[:index]  # rebuild the list without that value