如何在python中将一个元素从列表移动到另一个元素

时间:2016-11-08 22:08:12

标签: python list python-3.x

def ListNum(x):
    list1 = []
    for i in (x):
        if x[i] < x [i + 1]:
            list1.append[i]
        else:
            break
    return(list1)
ListNum([1,2,3,4,5,6,2,3,4])

所以,我输入一个数字列表并浏览列表并检查该列表中的第一个值是否小于第二个值,如果是这样,将其添加到list1,继续直到该值大于下一个值。

所以,如果我输入ListNum([1,2,3,4,5,6,2,3,4])

我应该list1[1,2,3,4,5,6]

但它不起作用

3 个答案:

答案 0 :(得分:2)

您不需要索引,您可以像这样压缩列表:

def ListNum(x):
    list1 = []
    for e1, e2 in zip(x, x[1:]):
        if e1 < e2:
            list1.append(e1)
        else:
            break
    return list1

这也有利于在列表排序时修复错误。

答案 1 :(得分:1)

如果您执行for i in x,则会遍历x中的元素,而不是其索引。

要遍历索引,您必须执行for i in range(len(x))

答案 2 :(得分:1)

我认为您从不想要将x中的最后一项添加到list1,因为之后没有项目可以与之进行比较。

您的代码无法正常运行,因为for i in (x):会迭代x中的,而不是其索引。但即使它确实迭代了索引,你的代码也可能会崩溃IndexError,因为它可能会尝试将列表中的最后一项与之后的项进行比较,但不存在

以下是几种方法。

from itertools import takewhile

def list_nums0(x):
    list1 = []
    for i in range(len(x) - 1):
        if x[i] < x[i + 1]:
            list1.append(x[i])
        else:
            break
    return list1

def list_nums1(x):
    list1 = []
    for u, v in zip(x, x[1:]):
        if u < v:
            list1.append(u)
        else:
            break
    return list1

def list_nums2(x):
    list1 = []
    for i, u in enumerate(x[:-1], 1):
        if u < x[i]:
            list1.append(u)
        else:
            break
    return list1

def list_nums3(x):
    return [t[0] for t in takewhile((lambda a:a[0] < a[1]), zip(x, x[1:]))]

list_nums = list_nums3
print(list_nums([1,2,3,4,5,6,2,3,4]))

<强>输出

[1, 2, 3, 4, 5]

list_nums0只是迭代x的索引。

list_nums1使用zipxx[1:]上并行进行迭代。这就是现在和下一项是uv

list_nums2使用enumerate获取u中的当前项和i中下一项的索引。

list_nums3使用takewhile迭代zip产生的元组,直到我们得到一对不满足测试的项目。它在列表推导中执行整个操作,这比在传统的.append循环中使用for稍微有效一些。

如果我们到目前为止,这些版本也会添加列表中的最后一项。执行此操作的简单方法是创建一个新的临时列表,其最后一项保证大于“真实”最后一项。

from itertools import takewhile

def list_nums0(x):
    x = x + [x[-1] + 1]
    list1 = []
    for i in range(len(x) - 1):
        if x[i] < x[i + 1]:
            list1.append(x[i])
        else:
            break
    return list1

def list_nums1(x):
    list1 = []
    for u, v in zip(x, x[1:] + [x[-1] + 1]):
        if u < v:
            list1.append(u)
        else:
            break
    return list1

def list_nums2(x):
    x = x + [x[-1] + 1]
    list1 = []
    for i, u in enumerate(x[:-1], 1):
        if u < x[i]:
            list1.append(u)
        else:
            break
    return list1

def list_nums3(x):
    return [t[0] for t in takewhile((lambda a:a[0] < a[1]), zip(x, x[1:] + [x[-1] + 1]))]

# test all the functions

funcs = (
    list_nums0,
    list_nums1,
    list_nums2,
    list_nums3,
)

data = [1, 2, 3, 4, 5, 6, 0]
print('data', data)
for i, list_nums in enumerate(funcs):
    print(i, list_nums(data))

data = [1, 2, 3, 4, 5, 6]
print('data', data)
for i, list_nums in enumerate(funcs):
    print(i, list_nums(data))

<强>输出

data [1, 2, 3, 4, 5, 6, 0]
0 [1, 2, 3, 4, 5]
1 [1, 2, 3, 4, 5]
2 [1, 2, 3, 4, 5]
3 [1, 2, 3, 4, 5]
data [1, 2, 3, 4, 5, 6]
0 [1, 2, 3, 4, 5, 6]
1 [1, 2, 3, 4, 5, 6]
2 [1, 2, 3, 4, 5, 6]
3 [1, 2, 3, 4, 5, 6]

当然,如果您传递一个空列表,此策略将失败。简单的方法就是把它放在函数的顶部:

if not x:
    return []

例如,

def list_nums1(x):
    if not x:
        return []
    list1 = []
    for u, v in zip(x, x[1:] + [x[-1] + 1]):
        if u < v:
            list1.append(u)
        else:
            break
    return list1

我们可以像这样重写list_nums3以保持单行:

def list_nums3(x):
    return [] if not x else [t[0] for t in takewhile((lambda a:a[0] < a[1]), zip(x, x[1:] + [x[-1] + 1]))]