使用re.sub()遍历列表

时间:2018-12-14 08:17:16

标签: python

我正在尝试使用长格式名称替换列表中的值。

value_list = ['Gi1/0/8', 'Gi1/0/31', 'Gi1/0/32', 'Gi1/0/33', 'Gi1/0/34', 'Gi1/0/23', 'Gi1/0/27']

我正在运行以下脚本:

for value in value_list:
    value = re.sub(r'Gi', 'GigabitEthernet', value)
    print value
print value_list

这是我的输出:

GigabitEthernet1/0/8
GigabitEthernet1/0/31
GigabitEthernet1/0/32
GigabitEthernet1/0/33
GigabitEthernet1/0/34
GigabitEthernet1/0/23
GigabitEthernet1/0/27

我只需要更改列表中的值,看来做错了。谁能帮助我以有效的方式做到这一点,所以我不需要从各个输出中创建另一个列表?

4 个答案:

答案 0 :(得分:1)

然后使用列表理解:

Div

输出:

print([re.sub(r'Gi', 'GigabitEthernet', value) for value in value_list])

答案 1 :(得分:1)

要“就地”更改列表,您需要将列表中的每个项目设置为新值。仅执行value = re.sub(r'Gi', 'GigabitEthernet', item)不会更改列表中存储的值。

此代码更改列表中的值:

>>> value_list = ['Gi1/0/8', 'Gi1/0/31', 'Gi1/0/32', 'Gi1/0/33', 'Gi1/0/34', 'Gi1/0/23', 'Gi1/0/27']

>>> for idx, item in enumerate(value_list):
...     value_list[idx] = re.sub(r'Gi', 'GigabitEthernet', item)
... 
>>> value_list
['GigabitEthernet1/0/8', 'GigabitEthernet1/0/31', 'GigabitEthernet1/0/32', 'GigabitEthernet1/0/33', 'GigabitEthernet1/0/34', 'GigabitEthernet1/0/23', 'GigabitEthernet1/0/27']

enumerate函数为您生成列表索引,因此您可以通过Python(for item in mylist)遍历列表,而不必直接建立索引(for i in range(len(mylist))),这会产生可读性较低的代码。 / p>

答案 2 :(得分:1)

此代码将更新现有列表:

{% filter indent(width=4) %}
{% include "./sub-template.yml.j2" %}
{% endfilter %}

答案 3 :(得分:1)

使用map

例如:

import re

value_list = ['Gi1/0/8', 'Gi1/0/31', 'Gi1/0/32', 'Gi1/0/33', 'Gi1/0/34', 'Gi1/0/23', 'Gi1/0/27']
value_list = list(map(lambda value: re.sub(r'Gi', 'GigabitEthernet', value), value_list))
print(value_list)

输出:

['GigabitEthernet1/0/8', 'GigabitEthernet1/0/31', 'GigabitEthernet1/0/32', 'GigabitEthernet1/0/33', 'GigabitEthernet1/0/34', 'GigabitEthernet1/0/23', 'GigabitEthernet1/0/27']