将列表元素与列表列表的元素进行比较,并有条件地创建新列表

时间:2016-01-06 23:14:50

标签: python list loops python-3.x filter

关于财务数据。我有一个72个日期70%百分位回报数据的清单:

list = [0.11,0.12,...,0.125]

此外,我有一个列表清单,其中包含500家公司在不同日期的72个退货(= 500个清单和每个清单72个条目):

list_of_lists = [[0.09,0.08,...,0.15],...,[0.1,0.34,...,0.01]]

我现在要做的是将列表的第一个条目(0.11)与列表列表中第一个列表中的所有条目进行比较。如果第一个列表中的条目超过0.11阈值(在本例中为上面的0.15),我想将此数字添加到新列表中。然后我想对list0.12)中的第二个条目和list_of_lists中的第二个条目执行相同的操作。最后,我基本上想要获得72个列表(或新的列表列表),其中包含高于相应70%百分位数的回报。

4 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您有500个72个值和72个阈值的列表。您想要将每个列表的 n th 值与 n th 进行比较您的阈值列表的值。换句话说,您希望按列进行。使用transpose首先this one cool trick list_of_lists最简单,以便list_of_lists中的每一列都成为一行:

transposed = zip(*list_of_lists)

现在我们可以使用行了。将阈值列表中的每个数字与transposed中的相应行配对。

lists_with_thresholds = zip(list, transposed)

lists_with_thresholds中的每个项目都是一对包含截止点和我们想要比较它的值。鸭子排成一排;我们只需找到该对的第二部分中超过相应截止点的值。

result = []
for threshold, values in lists_with_thresholds:
    values_over_threshold = []
    for x in values:
        if x > threshold:
            values_over_threshold.append(x)
    result.append(values_over_threshold)

或者,将嵌套的for循环压缩成嵌套的list comprehension

result = [[x for x in values if x > threshold]
          for threshold, values in zip(list, zip(*list_of_lists))]

这两个版本完全相同 - 它们编译成相同的字节代码,用于所有意图和目的 - 但我更喜欢列表理解,因为它更短,并且具有更多功能感。

答案 1 :(得分:2)

你可以用列表理解来做到这一点我认为:

thresholds = [0.11,0.12,0.125]
quotes = [[0.09,0.08,0.15],[0.09,0.08,0.15],[0.1,0.34,0.01]]
[filter(lambda x: x > thresholds[idx],qts) for idx,qts in enumerate(quotes)]

我从给定的列表中做了一些真实的列表(省略...),这是一个编译的例子。

列表推导的工作原理如下:我们从qts迭代quotes(并获得相应的索引idx,用于获取阈值)。接下来,我们对filter执行qts操作,并且只允许大于threshold[idx]的元素(该时间戳的阈值)。

使用python运行此操作会发出:

$ python
Python 2.7.9 (default, Apr  2 2015, 15:33:21) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> thresholds = [0.11,0.12,0.125]
>>> quotes = [[0.09,0.08,0.15],[0.09,0.08,0.15],[0.1,0.34,0.01]]
>>> [filter(lambda x: x > thresholds[idx],qts) for idx,qts in enumerate(quotes)]
[[0.15], [0.15], [0.34]]

这似乎是你想要的。

编辑中,这也应该有效,尽管过滤器已“延迟”:

$ python3
Python 3.4.3 (default, Mar 26 2015, 22:03:40) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> thresholds = [0.11,0.12,0.125]
>>> quotes = [[0.09,0.08,0.15],[0.09,0.08,0.15],[0.1,0.34,0.01]]
>>> res=[filter(lambda x: x > thresholds[idx],qts) for idx,qts in enumerate(quotes)]
>>> res[0]
<filter object at 0x7f0d3fbc2be0>
>>> list(res[0])
[0.15]

如果您想立即实现列表,您可以稍微改变列表理解为:

[list(filter(lambda x: x > thresholds[idx],qts)) for idx,qts in enumerate(quotes)]

结果是:

>>> [list(filter(lambda x: x > thresholds[idx],qts)) for idx,qts in enumerate(quotes)]
[[0.15], [0.15], [0.34]]

答案 2 :(得分:1)

我认为这就是你想要的:

new_list = []
for i in lists_of_lists:
    for j in i:
        if j > list[0]:
            new_list.append(j)

答案 3 :(得分:0)

您可以使用列表理解:

list = [4, 3, 2, 3, 4, 5]
list_of_lists = [[6, 1, 3, 7, 2, 5], [1, 2, 6, 3, 8, 1], [1, 2, 3, 2, 7, 6]]

above = [[ret for i, ret in enumerate(lst) if ret > list[i]] for lst in list_of_lists]
  

[[6,3,7],[6,8],[3,7,6]]

这将删除list_of_lists中列表中小于或等于list对应元素的所有条目。