在迭代包含迭代项,上一项和下一项的列表时生成新列表

时间:2018-07-24 12:00:11

标签: python algorithm list

有15个元素的列表。从这个列表中,我想每次迭代x。 item,以及item x-1和x + 1并生成一个新列表。

示例:在4.迭代中,我位于第4个项目,我想获得第3个和第5个项目并生成一个新列表。 newlist = [3,4,5]在下一个项目5的迭代中,我要获取项目4和6,并生成一个新列表,依此类推。

如果该项目在第一个项目上进行迭代,则应该仅取下一个项目和他自己。如果该项目是列表中的最后一个项目,则应仅接受前一个项目及其本人。

短:如果在x处进行迭代,则将x-1,x和x + 1移至新列表。在下一次迭代之前,清除列表,如list.clear()

算法模式作为excel表: enter image description here

我的代码尝试,(但我认为可以更好):

list_ = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_list = []
for item in list_:
    print("POS:", list_.index(item))
    if list_.index(item) == 0:
        new_list.append(list_[list_.index(item)])
        new_list.append(list_[list_.index(item+1)])
        print(new_list)
        new_list.clear()
        print("*"*55)
    elif list_.index(item) >= 1 and list_.index(item) < len(list_)-1:
        new_list.append(list_[list_.index(item)-1])
        new_list.append(list_[list_.index(item)])
        new_list.append(list_[list_.index(item)+1])
        print(new_list)
        new_list.clear()
        print("*"*55)
    elif list_.index(item) <= len(list_):
        new_list.append(list_[list_.index(item)-1])
        new_list.append(list_[list_.index(item)])
        print(new_list)
        new_list.clear()
        print("*"*55)

输出:

POS: 0
[0, 1]
*******************************************************
POS: 1
[0, 1, 2]
*******************************************************
POS: 2
[1, 2, 3]
*******************************************************
POS: 3
[2, 3, 4]
*******************************************************
POS: 4
[3, 4, 5]
*******************************************************
POS: 5
[4, 5, 6]
*******************************************************
POS: 6
[5, 6, 7]
*******************************************************
POS: 7
[6, 7, 8]
*******************************************************
POS: 8
[7, 8, 9]
*******************************************************
POS: 9
[8, 9, 10]
*******************************************************
POS: 10
[9, 10]
*******************************************************

欢迎一些更好的方法或更有效的算法。

1 个答案:

答案 0 :(得分:2)

您可以使用列表切片来实现:

list_ = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_list = [list_[max(0, i-1):i+2] for i in range(len(list_))]

给你

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

或者,如果您真的想在不存储到新列表的情况下对其进行迭代(即与您的代码等效):

list_ = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in range(len(list_)):
    new_list = list_[max(0, i-1):i+2]
    print(new_list)
    # no need to clear it as it will be overwritten on the next loop anyway
    print("*" * 55)