【问题标题】:How to get a sublist of a list based on another list?如何根据另一个列表获取列表的子列表?
【发布时间】:2019-03-01 14:47:33
【问题描述】:
a = [12,3,8,14]
b = ['a','b','c','d']

我想找到b中元素的子列表,使得a中的对应项大于10

b_even = [b[i] for i, e in enumerate(a) if e > 10]

这段代码可以正常工作,但有没有像 R 中的 b[a>10] 这样更简单的方法?

【问题讨论】:

  • 您已经拥有使用列表执行此操作的“Pythonic”方式。您建议的较短语法可用于 numpy 数组。
  • 在 Python 中,我会使用 [y for x,y in zip(a,b) if x > 10]。但是不,Python list 对象不支持向量化操作。为此使用numpypandas
  • 在 zip 和 numpy 方法之间,哪个更快?

标签: python list indexing list-comprehension


【解决方案1】:

邮编?

print([[*i] for i in list(zip(a,b)) if i[0] > 10])
[[12, 'a'], [14, 'd']]

【讨论】:

    【解决方案2】:
    import numpy as np
    a = np.array(a)
    b = np.array(b)
    c = b[np.where(a>10)]
    

    【讨论】:

    • numpy 数组方法是否比 zip for list 更快?
    • 我没有测试过,但是numpy通常比zip和list快
    【解决方案3】:

    常规解决方案是使用zip:

    res = [i for i, j in zip(a, b) if j > 10]
    

    通过operator.itemgetterenumerate 可以实现功能替代:

    from operator import itemgetter
    
    res = itemgetter(*(idx for idx, val in enumerate(a) if val > 10))(b)
    

    对于矢量化功能/语法,您可以使用 3rd 方库,例如 NumPy。

    【讨论】:

    • 谢谢!这有帮助
    • @Jensen,没问题。你应该accept 一个有帮助的答案(左边的绿色勾号)。
    【解决方案4】:

    我的第一选择是你所拥有的,但我可以得到相同的结果;

    [s[1] for s in zip(a, b) if s[0] > 10]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2020-05-06
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多