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)-1
或 0 + 2*(not 0)-1
或 0 + 2*1-1
或 1
.
处的项目
1 将获取索引 1 + 2*(not 1%2)-1
或 1 + 2*(not 1)-1
或 1 + 2*0-1
或 0
.
处的项目
2 将获取索引 2 + 2*(not 2%2)-1
或 2 + 2*(not 0)-1
或 2 + 2*1-1
或 3
.
处的项目
3 将获取索引 3 + 2*(not 3%2)-1
或 3 + 2*(not 1)-1
或 3 + 2*0-1
或 2
.
处的项目
如您所见,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')
>>>
我在 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)-1
或 0 + 2*(not 0)-1
或 0 + 2*1-1
或 1
.
1 将获取索引 1 + 2*(not 1%2)-1
或 1 + 2*(not 1)-1
或 1 + 2*0-1
或 0
.
2 将获取索引 2 + 2*(not 2%2)-1
或 2 + 2*(not 0)-1
或 2 + 2*1-1
或 3
.
3 将获取索引 3 + 2*(not 3%2)-1
或 3 + 2*(not 1)-1
或 3 + 2*0-1
或 2
.
如您所见,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')
>>>