Python中的元组列表

2024-06-25 23:07:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python列表,如下所示:

test = ['Vlan101', '1.1.1.0/24', 'Vlan111', '2.1.1.0/24', 'Vlan701', '3.1.1.0/24', 'Vlan703', '4.1.1.0/24', '5.5.5.0/24']

我希望用它创建元组,如下所示:

Vlan101,1.1.1.0/24
Vlan111,2.1.1.0/24
Vlan701,3.1.1.0/24
Vlan703,4.1.1.0/24, 5.5.5.0/24

最重要的是最后一个,同一个键有两个值。 这是我的头条新闻。你知道吗


Tags: test列表元组头条新闻vlan701vlan111vlan101vlan703
3条回答

您可以在这里使用itertools.groupby()+zip()

from itertools import groupby

test = [
    "Vlan101",
    "1.1.1.0/24",
    "Vlan111",
    "2.1.1.0/24",
    "Vlan701",
    "3.1.1.0/24",
    "Vlan703",
    "4.1.1.0/24",
    "5.5.5.0/24",
]

print(
    [
        (x,) + y
        for x, y in zip(
            (x_ for x_ in test if x_.startswith("Vlan")),
            (
                tuple(g)
                for k, g in groupby(test, key=lambda x__: x__.startswith("Vlan"))
                if not k
            ),
        )
    ] 
)

# [('Vlan101', '1.1.1.0/24'), ('Vlan111', '2.1.1.0/24'), ('Vlan701', '3.1.1.0/24'), ('Vlan703', '4.1.1.0/24', '5.5.5.0/24')]

可以使用zip+iter作为通用方法

i = len(test)%2
s = iter(test[:-(2+i)])
[x for x in zip(s,s)] + [tuple(test[-(2+i):])]

输出

[('Vlan101', '1.1.1.0/24'),
 ('Vlan111', '2.1.1.0/24'),
 ('Vlan701', '3.1.1.0/24'),
 ('Vlan703', '4.1.1.0/24', '5.5.5.0/24')]

如果希望外部对象也是tuple

tuple(x for x in zip(s,s)) + (tuple(test[-(2+i):]),)

(('Vlan101', '1.1.1.0/24'),
 ('Vlan111', '2.1.1.0/24'),
 ('Vlan701', '3.1.1.0/24'),
 ('Vlan703', '4.1.1.0/24', '5.5.5.0/24'))

元组的第二、第三等元素看起来像ip地址。您可以使用正则表达式来识别特定的格式。(我冒着风险假设你在玩ip地址)。你知道吗

这里有另一个解决方案,比Rafael'sRoadRunner's更简洁,但是允许任意数量的地址。你知道吗

import re

test = [
        'Vlan101',
        '1.1.1.0/24',
        'Vlan111',
        '2.1.1.0/24',
        'Vlan701', 
        '3.1.1.0/24', 
        'Vlan703', 
        '4.1.1.0/24', 
        '5.5.5.0/24']

result = [[]]  # we first store the stuff as lists to allow for appending
for item in test:

    # matches ipaddresses with xxx.xxx.xxx.xxx/xx
    if re.match(r'\d{,3}\.\d{,3}\.\d{,3}\.\d{,3}/\d+', item):
        result[-1].append(item)    # appends an ipaddress
    else:
        result.append([item])      # appends a new 'Vlan...' (i.e. anything but an ipaddress)

tups = list(map(tuple, result))    # cast each of the lists into tuples

print(result)
print(tups)

输出:

[[], ['Vlan101', '1.1.1.0/24'], ['Vlan111', '2.1.1.0/24'], ['Vlan701', '3.1.1.0/24'], ['Vlan703', '4.1.1.0/24', '5.5.5.0/24']]
[(), ('Vlan101', '1.1.1.0/24'), ('Vlan111', '2.1.1.0/24'), ('Vlan701', '3.1.1.0/24'), ('Vlan703', '4.1.1.0/24', '5.5.5.0/24')]

空的[]()在开头,以防您的test列表立即以地址开始(它是为result[-1]提供一个后备)。你知道吗

如果你想删除这些结果,只需做一个切片

print(tups[1:])

输出:

[('Vlan101', '1.1.1.0/24'), ('Vlan111', '2.1.1.0/24'), ('Vlan701', '3.1.1.0/24'), ('Vlan703', '4.1.1.0/24', '5.5.5.0/24')]

相关问题 更多 >