关于财务数据。我有一个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
),我想将此数字添加到新列表中。然后我想对list
(0.12
)中的第二个条目和list_of_lists
中的第二个条目执行相同的操作。最后,我基本上想要获得72个列表(或新的列表列表),其中包含高于相应70%百分位数的回报。
答案 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]]
这似乎是你想要的。
编辑在python-3.x中,这也应该有效,尽管过滤器已“延迟”:
$ 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
对应元素的所有条目。