修改一些与集合类型无关的集合元素

时间:2019-04-04 14:56:40

标签: python collections iterator

我正在尝试编写函数,该函数可以修改任何类型(列表,字典等)集合中的(字符串类型)元素,或创建具有相同元素的相同类型的新集合,但要根据我的规则进行修改

我是python的新手,我有一个一般性的问题,但将更具体地描述具体情况。

我在MongoDB中使用固定大小写敏感的MAC地址格式,例如12:34:56:78:9a:bc。我们知道12:34:56:78:9a:bc12:34:56:78:9A:BC12-34-56-78-9A-BC123456789abc对我们和物理表示都是相同的值,但是在MongoDB中它们是不同的。因此,我的函数将检查字符串是否表示MAC地址,并将其转换为所需的格式。但是我希望它接受字符串列表,字符串字典作为值,(也许)字符串元组,字符串列表字典等,以更改其值。

所以我现在拥有的是

def formMacAddress(addr):
    if type(addr) is str:
        addr = addr.lower()
        if not re.match('[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$', 
                addr):
            raise ValueError("'{addr}' is not MAC address".format(addr=addr))
        return re.sub('([0-9a-f]{2})[-:]?', '\g<1>:', addr, 5)
    if type(addr) is dict:
        res = {}
        for k, v in addr.items():
            res[k] = formMacAddress(v)
        return res
    if type(addr) is list:
        res = list(addr)
        for k, v in enumerate(addr):
            res[k] = formMacAddress(v)
        return res
    raise ValueError("'{addr}' is not MAC address".format(addr=addr))

所以问题是我不喜欢检查具有相同主体的集合类型。将来可能会有更多类型。我期望python能够避免这种情况。

例如,在C ++中,我可以使用set迭代器。在lua中,只能使用一种收集类型。但是我找不到用python做到这一点的正确方法。我无法使用迭代器设置值,列表中不存在items()方法,并且enumerate()仅适用于列表在循环时使用索引访问其元素。我想念的是什么?

1 个答案:

答案 0 :(得分:0)

您可以遍历dict或list或tuple :(必须隔离类型str)

def formMacAddress(addr):
    seq_iter = addr if isinstance(addr, dict) else range(len(addr))
    print(seq_iter)
    for i in seq_iter:
        print(addr[i])

formMacAddress({"0":"12","1":"34"})
formMacAddress(["0","12"])
formMacAddress(("1","12"))

输出:

{'0': '12', '1': '34'}
12
34
range(0, 2)
0
12
range(0, 2)
1
12