【问题标题】:How to extract values from list without having to iterate the whole list?如何从列表中提取值而不必迭代整个列表?
【发布时间】:2021-05-04 17:50:56
【问题描述】:

考虑一个列表列表,如下所示:

my_list = [[0,"zero"], [0,"zero 2x"], [1,"one"], [2,"two"]]

根据第一个值获取子集的最有效方法是什么?我想得到:

zero_list = ["zero", "zero 2x"]

当然可以迭代整个列表,但是有几千个值似乎效率低。

zero_list = []
for i in my_list:
    if i[0] == 0:
        zero_list.append(i[1])

有没有更有效的方法? lambda 表达式可以做到这一点吗?

【问题讨论】:

  • 为什么不使用列表推导?例如。 zero_list = [j for i, j in my_list if i == 0]
  • my_list 是否按第一个元素排序?
  • @DocDriven 列表推导通常并不比常规循环更有效——它只是在循环中构建列表时的语法糖。
  • @PranavHosangadi 我知道这一点,但对于这个简单的案例,它是最快且最易读的解决方案。
  • @PranavHosangadi 我同意你的观点,这可能会给人一种错误的印象。我想说的是两种解决方案之间的差异可以忽略不计,列表组合在这种情况下更具可读性。

标签: python-3.x list


【解决方案1】:

您可以将列表转换为 DataFrame 并提取目标值:

df = pd.DataFrame(my_list, columns= ['value', 'char'])
df1 = df[df['value'] == 0].reset_index(drop=True)

【讨论】:

  • 这不是更快。将列表解析为数据框需要时间。这段时间最好只在循环中遍历列表。 Proof on repl.it 确切的时间各不相同,但在我尝试过的所有地方,我发现循环至少比使用 pandas 快 4 倍。
【解决方案2】:

简单的解决方案:如果您想在不迭代的情况下从列表中获取所有元素,并且您可以一次从列表中获取所有元素,因为它是单独的原始数据类型(而不是再次作为输出列出),那么下面是更好的解决方案:

my_list=[1,2,3,4]
print(*my_list)

Output: 1 2 3 4

您可以使用*listname,它将从列表中单独生成所有元素

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多