Python 反转列表的每两个元素

Python invert every two elements of list

我在 Python 中有一个列表,我希望反转列表中的每一对元素。这是列表:

list_ty = ['many_ord','many','12_FH_Temp_ord','12_FH_Temp','Celsius_ord','Celsius','Pressure_Pas_ord','Pressure_Pas','Kelvin_ord','Kelvin']

这是我想要得到的:

list_out = ['many','many_ord','12_FH_Temp','12_FH_Temp_ord','Celsius','Celsius_ord','Pressure_Pas','Pressure_Pas_ord','Kelvin','Kelvin_ord']

附加信息:

列表中的元素数量总是偶数。

_ord 结尾的项目总是在没有 _ord 的项目之前。

问题:

有没有办法颠倒每个以 _ord 结尾的项目和后面没有 _ord 的(相关)项目的顺序?

偷懒的方法:

>>> [x + y for x in list_ty if not x.endswith('_ord') for y in ('', '_ord')]
['many', 'many_ord', '12_FH_Temp', '12_FH_Temp_ord', 'Celsius', 'Celsius_ord', 'Pressure_Pas', 'Pressure_Pas_ord', 'Kelvin', 'Kelvin_ord']

忽略任何以“_ord”结尾的条目,只是将其交替添加到其他元素中。

作为单线可能有点傻,但是你开始吧:

from itertools import chain

list_out = list(chain.from_iterable(zip(list_ty[1::2], list_ty[::2])))

解释一下:我们使用第 2 步偏移量为 1 的切片来获取奇数索引中的值,并使用第 2 步偏移量为 0 的另一个切片来获取偶数索引。我们把它们 zip 放在一起,把 [even, odd, even, odd,...] 变成 ((odd, even), (odd, even), ...),然后用 chain.from_iterable 把那些 tuple 压平,用 list 实现 chain 我们的发电机。

一次使用 for 循环和第 2 步元素。您可以使用基本的 python 变量交换然后:

a, b = b, a

list_ty = ['many_ord','many','12_FH_Temp_ord','12_FH_Temp','Celsius_ord','Celsius','Pressure_Pas_ord','Pressure_Pas','Kelvin_ord','Kelvin']

for i in range(0, len(list_ty), 2):
    list_ty[i], list_ty[i+1] = list_ty[i+1], list_ty[i] 

list_ty 在此循环后具有以下值:

['many', 'many_ord', '12_FH_Temp', '12_FH_Temp_ord', 'Celsius', 'Celsius_ord', 'Pressure_Pas', 'Pressure_Pas_ord', 'Kelvin', 'Kelvin_ord']

有很多方法可以做到这一点,这里是 range(len()):

list_out = [list_ty[idx+2*(not idx%2)-1] for idx in range(len(list_ty))]

这将遍历原始列表中的每个可能的索引并获取该索引之前或之后的项目。

0 将获取索引 0 + 2*(not 0%2)-10 + 2*(not 0)-10 + 2*1-11.

处的项目

1 将获取索引 1 + 2*(not 1%2)-11 + 2*(not 1)-11 + 2*0-10.

处的项目

2 将获取索引 2 + 2*(not 2%2)-12 + 2*(not 0)-12 + 2*1-13.

处的项目

3 将获取索引 3 + 2*(not 3%2)-13 + 2*(not 1)-13 + 2*0-12.

处的项目

如您所见,0123 变成了 1032,这种模式将一直持续到结果完成。

这样怎么样:

>>> sum(zip(list_ty[1::2], list_ty[::2]), ())
('many', 'many_ord', '12_FH_Temp', '12_FH_Temp_ord', 'Celsius', 'Celsius_ord',     'Pressure_Pas', 'Pressure_Pas_ord', 'Kelvin', 'Kelvin_ord')
>>>