<p>除了用户3080953给出的答案外,您还必须对数据进行预处理,这不仅是因为这样会更有效,而且还因为它将帮助您处理复杂性。在这里,您同时做两件事:解码列表和使用数据。先解码,再使用。在</p>
<p>我认为,目标格式应该是:</p>
<pre><code>prices_and_quantities_by_symbol = {
'ethbtc': {
'prices':[0.077666, 0.077680, 0.077710, 0.078200],
'quantities':[1, 1.5, 3, 4]
},
'btceth': {
...
},
...}
</code></pre>
<p>现在,你只需:</p>
^{pr2}$
<p>如何获取目标格式的数据?只需迭代列表,如果找到符号,则开始存储值和数量,直到下一个符号:</p>
<pre><code>prices_and_quantities_by_symbol = {}
symbol_set = (symbol_list) # O(len(symbol_list))
for i, v in enumerate(list1): # O(len(list1))
if v in symbol_set: # amortized O(1) lookup
current_prices = []
current_quantities = []
current_start = i+1
prices_and_quantities_by_symbol[v] = {
'prices':current_prices,
'quantities':current_quantities
}
else: # a value or a quantity
(current_prices if (i-current_start)%2==0 else current_quantities).append(float(v))
</code></pre>
<p>您有一个轻微但有趣的优化,特别是如果您的数量/值列表很长。不要存储数量,而是存储总数量:</p>
<pre><code>prices_and_running_total_by_symbol = {
'ethbtc': {
'prices':[0.077666, 0.077680, 0.077710, 0.078200],
'running_total':[1, 2.5, 5.5, 9.5]
},
'btceth': {
...
},
...}
</code></pre>
<p>现在,您可以使用<code>bisect</code>快速找到您的max_值。代码变得更容易理解,因为<code>bisect.bisect_left(rts, my_current_balance)</code>将返回第一次运行的总计<code>>= my_current_balance</code>的索引:</p>
<pre><code>for symbol, prices_and_running_totals in prices_and_running_totals_by_symbol.items(): # O(len(symbol_list))
ps = prices_and_running_totals["prices"]
rts = prices_and_running_totals["running_total"]
i = bisect.bisect_left(rts, my_current_balance) # O(log(len(rts)))
yield symbol, ps[i] # this will yield the symbol and the associated max_value
</code></pre>
<p>要建立运行总数,您必须以不同的方式处理价格和数量:</p>
<pre><code># O(len(list1))
...
if v in symbol_set: # amortized O(1) lookup*
...
elif (i-current_start)%2==0:
current_prices.append(float(v))
else:
current_running_totals.append((current_running_totals[-1] if current_running_totals else 0.0) + float(v))
</code></pre>
<p>将所有内容放入函数中(或者更好地说,类的方法):</p>
<pre><code>prices_and_running_totals_by_symbol = process_data(list1)
for symbol, max_value in symbols_max_values(prices_and_running_totals_by_symbol, my_current_balance):
print(symbol, max_value)
</code></pre>
<p>你可以看到,通过将问题分成两部分(解码和使用),代码变得更快(在我看来)更容易理解(我没有发表评论,但它们应该在那里)。在</p>