<p>由于您没有使用<code>newPrice</code>列表中的最后两个元素,我认为我们可以从一开始就忽略它们,这可以让生活更轻松:</p>
<pre><code>>>> from itertools import chain
>>> newPriceArr = []
>>> n = 5
>>> for i in range(1, 6): # because there are lists named from 1 to 5, to access them from globals
tempList = [
sorted(elem, reverse=True, key=lambda x:x[0])[:4]
for elem in
zip(*[
iter(
zip(
globals()[f"rate{i}"], globals()[f"dev{i}"]
)
)
] * n
)
]
newPriceArr.append(tempList)
>>> newPriceArr
# it is now equivalent to [newPrice1, newPrice2, ..., newPrice5]
>>> flattened_arr = [sorted(
chain.from_iterable(elem),
reverse=True,
key=lambda x:x[0]
)[:4] for elem in zip(*newPriceArr)]
>>> flattened_arr
[[(16, 7), (16, 2), (16, 10), (15, 22)],
[(16, 12), (16, 7), (10, 90), (9, 49)],
[(9, 48), (8, 48), (8, 37), (8, 61)],
[(1232, 4), (457, 457), (415, 77), (324, 24)],
[(5216, 572), (562, 562), (545, 545), (545, 545)]]
>>> temp = [list(zip(*elem)) for elem in flattened_arr]
>>> temp
[[(16, 16, 16, 15), (7, 2, 10, 22)],
[(16, 16, 10, 9), (12, 7, 90, 49)],
[(9, 8, 8, 8), (48, 48, 37, 61)],
[(1232, 457, 415, 324), (4, 457, 77, 24)],
[(5216, 562, 545, 545), (572, 562, 545, 545)]]
>>> Rate, dev = list(zip(*temp))
>>> Rate
((16, 16, 16, 15),
(16, 16, 10, 9),
(9, 8, 8, 8),
(1232, 457, 415, 324),
(5216, 562, 545, 545))
>>> dev
((7, 2, 10, 22),
(12, 7, 90, 49),
(48, 48, 37, 61),
(4, 457, 77, 24),
(572, 562, 545, 545))
# you can convert these to list later if you want
</code></pre>
<p><strong>说明:</strong></p>
<p>本部分:</p>
<pre><code>zip(*[
iter(
zip(
globals()[f"rate{i}"], globals()[f"dev{i}"]
)
)
] * n
)
</code></pre>
<p>请参见:<a href="https://stackoverflow.com/q/2233204/5431791">^{<cd2>}</a>,这基本上是从列表中生成<code>n</code>元素子列表</p>
<p>现在,<code>newPriceArr</code>,正如我前面提到的,持有:</p>
<pre><code>[
newPrice1,
newPrice2,
newPrice3,
newPrice4,
newPrice5
]
</code></pre>
<p>根据你的数据</p>
<p><code>Flattened_arr</code>的代码如下所示:</p>
<pre><code># say we have a list like:
>>> newPrice = [
[[(10,1), (5,2), (3,1)], [(1,2), (3,5), (6,8)]], # sub_A
[[ (9,4), (8,5), (1,0)], [(3,2), (7,6), (0,5)]] # sub_B
]
# Now we need to find top 2 maximum values from each vertical set ([sub_A[i], sub_B[i]]):
# in order to do that, we need to concatenate all the vertical elements into
# a single list, so that we can sort those, to concatenate we do:
>>> list([zip(*newPrice)])
[
([(10, 1), (5, 2), (3, 1)], [(9, 4), (8, 5), (1, 0)]),
([(1, 2), (3, 5), (6, 8)], [(3, 2), (7, 6), (0, 5)])
]
# Even though we have grouped the vertical set, but they are in a tuple,
# and still in their own sublists, we need to truly concatenate those, so
>>> from itertools import chain
>>> [list(chain.from_iterable(elem)) for elem in zip(*newPrice)]
[[(10, 1), (5, 2), (3, 1), (9, 4), (8, 5), (1, 0)],
[(1, 2), (3, 5), (6, 8), (3, 2), (7, 6), (0, 5)]]
# Now, these are concatenated, now we need to sort
>>> [sorted(chain.from_iterable(elem), reverse=True) for elem in zip(*newPrice)]
[[(10, 1), (9, 4), (8, 5), (5, 2), (3, 1), (1, 0)],
[(7, 6), (6, 8), (3, 5), (3, 2), (1, 2), (0, 5)]]
# now to select 2 elems
>>> [sorted(chain.from_iterable(elem), reverse=True)[:2] for elem in zip(*newPrice)]
[[(10, 1), (9, 4)], [(7, 6), (6, 8)]] # flattened_arr
</code></pre>