【问题标题】:Is it possible to use the same slice notation in both a list and an element to get the same result?是否可以在列表和元素中使用相同的切片符号来获得相同的结果?
【发布时间】:2019-11-18 22:18:55
【问题描述】:

我想获取列表最后一个索引中的元素,但有时最后一个索引是一个列表,在这种情况下我想要嵌套列表中的第一个元素。

#list in moment 1:
Lm1 = [1,2,3,4]

#list in moment 2:
Lm2 = [1,2,3,4,[1,2,3]]

我可以只使用一个 if。

#Option1:

def if_list(lastposition):
    if isinstance(lastposition, list):
        return list[0]
    else:
        return lastposition

element = if_list(Lm1[-1])
do whatever

或者,如果我想在这两种情况下执行相同的操作,我可以像这样构建列表并使用相同的切片表示法。它会给出我想要的元素。

#Option2:

Lm1 = [[1],[2],[3],[4]]
Lm2 = [[1],[2],[3],[4],[1,2,3]]

Lm1[-1][0]
Lm2[-1][0]

有没有办法使用类似于切片表示法的方法来做到这一点,这种方法在两种情况下都有效(当索引是列表时,当索引不是列表时)或简单的单列?

类似:

#Lm1[-1:][:]...

问题是我不知道仅构建列表是否更节省时间 像 Option2 并使用相同的切片表示法或每次都像 Option1 一样使用 if 原因。

我使用的是 pythom 3.7,对旧版本不太了解。

【问题讨论】:

  • 或者尝试一下?
  • “有没有办法使用类似于切片表示法的东西在这两种情况下都可以使用”不,没有。一般来说,如果您的列表包含这样的异构数据类型,则表明您的设计存在问题。

标签: python python-3.x list nested slice


【解决方案1】:

我创建了一个测试平台,使用 try-except 和 isinstance 进行比较,看看哪个更快,结果如下。

选项2: 将所有数据解析为列表对我来说似乎不是一种有效的方法。 :/

import time, statistics 

Lm2 = [1,2,3,4,1,2,3]
t = []
for y in range(4):
    s = time.time()
    for i in range(100000):
        if isinstance(Lm2[-1], list):
            x =  Lm2[-1][0]
        else:
            x = Lm2[-1]
    t.append(time.time() - s)
print(statistics.mean(t))

Lm2 = [1,2,3,[4,1,2,3]]
t = []
for y in range(4):
    s = time.time()
    for i in range(100000):
        try:
            x =  Lm2[-1][0]
        except Exception:
            x = Lm2[-1]
    t.append(time.time() - s)
print(statistics.mean(t))

Lm2 = [1,2,3,[4,1,2,3]]
t = []
for y in range(4):
    s = time.time()
    for i in range(100000):
        x = Lm2[-1][0] if type(Lm2[-1]) is list else Lm2[-1]
    t.append(time.time() - s)
print(statistics.mean(t))

按顺序排列结果如下

# When the last element is a list 
# 0.024208366870880127
# 0.011709034442901611
# 0.03266298770904541

# When the last element is an int 
# 0.02896404266357422
# 0.015629112720489502
# 0.03452497720718384

根据我得到的数据,使用try-except总是会更快

【讨论】:

  • 谢谢。由于我使用的是 timeit.timeit,因此我无法确定执行时间,我查看了您的代码以了解如何执行此操作。你认为捕捉“TypeError”异常有问题吗?是否有可能从意外原因中捕获相同的错误?我查看了 python 文档以查看案例切片引发错误并且找不到。 linklink
  • 你是绝对正确的,捕捉 TypeError 是更好的方法,如果你去我的答案的历史你会看到我在使用它,但我在测试时为了简单而改变了但忘了恢复回来了。一般异常应该是最后一个,因为您可能会遇到不同的错误类型。 @蒂亚戈路易斯
【解决方案2】:

如果你愿意,你可以这样做:

#list in moment 1:
Lm1 = [1,2,3,4]

#list in moment 2:
Lm2 = [1,2,3,4,[1,2,3]]

def test(test_list):
    return test_list[-1][0] if type(test_list[-1]) is list else test_list[-1]

print(test(Lm1))
print(test(Lm2))

检查最后一个值是否是一个列表,如果是,则返回第一个值,否则给你列表的最后一个元素。

【讨论】:

    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多