如何查看两个列表,如果一个列表中的一个条目与另一个列表中的条目匹配,则使用另一个,如果不匹配,则继续使用第一个列表?

2024-09-28 21:39:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在摆弄Python,以及它如何应用于股票交易。你知道吗

对于特定季度的特定股票,我给它赋值,帮助我决定是否喜欢该股票。这些值在一个名为“B”的列表中。我有另一个列表,其中包含同一只股票的所有季度,名为“发行日期”。你知道吗

如何创建一个查看releasedates列表的脚本,如果B列表中有特定季度的值,则使用B列表中的值,如果没有,则使用0?你知道吗

我试过了

release dates = [...(AAPL, 1, 2010), (AAPL, 2, 2010), (AAPL, 3, 2010), (AAPL, 4, 2010)...]

B = [(AAPL, 1, 2010, 2), (AAPL, 4, 2010, 10)]

output = []
for ticker, quarter, year, in releasedates:
    value_2 = 0
    for ticker_2, quarter_2, year_2, value in B:
        if (ticker_2 == ticker and year_2 == year and quarter_2 == quarter):
        output.append((ticker, quarter, year, value))   
    output.append((ticker, quarter, year, outside, value_2))

但对于每个日期,这会在两个不同的元组中给出B列表值和0值。像这样:

(格式为ticker、quarter、year、value)

[。。。 (AAPL,2015年3月10日), (AAPL,3,2015,0) (AAPL,4,2015,0) …]

我真正想要的是:

[。。。 (AAPL,2015年3月10日), (AAPL,4,2015,0) …]


Tags: andin列表foroutputvalueyear股票
2条回答

您可以使用字典通过ticker, quarter, year索引B,这样查找就很容易了

releasedates = [('AAPL', 1, 2010), ('AAPL', 2, 2010), ('AAPL', 3, 2010), 
    ('AAPL', 4, 2010)]
B = [('AAPL', 1, 2010, 2), ('AAPL', 4, 2010, 10)]
# index wanted values
B_index = {item[:3]:item[3] for item in B}
output = [(ticker, quarter, year, B_index.get((ticker, quarter, year), 0))
    for ticker, quarter, year in releasedates]
print(output)

我使用的是示例数据,因为您没有给出任何自己的示例。如果使用一个字典,其中键是某个股票,值是某种标志,则可以执行以下操作(O(n)speed complexity):

B = {1: True, 4: True}  # Example flags. True being a good stock in this example.
releases = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  # Example stocks.
for stock_id in releases:
    if B.get(stock_id):
        # Do Something

另一方面,在B内部的releases上循环:

B = [(2, True), (4, True)]
releases = [1,2,3,4,5,6,7,8,9,10]
for stock in releases:
    for flag in B:
        if stock == flag[0]:
            # Do Something, you've found a good stock.

更好的方法是,使用一些面向对象的设计并创建一个stock对象(下面的示例)。你知道吗

class Stock(object):
   def __init__(self, id, name, price, is_good):
       self.id = id
       self.name = name
       self.price = price
       self.is_good = is_good

这样,您就不需要并行化的数据容器来比较值;确定好的库存的数据完全封装在Stock对象本身中。你知道吗

现在我们可以看到一个潜在的循环看起来有多干净和高效(不再索引或访问其他容器,只需要一个简单的成员访问)。你知道吗

for stock in stocks:
   if stock.is_good:
       # enter code here

相关问题 更多 >