我正在尝试编写函数,该函数可以修改任何类型(列表,字典等)集合中的(字符串类型)元素,或创建具有相同元素的相同类型的新集合,但要根据我的规则进行修改
我是python的新手,我有一个一般性的问题,但将更具体地描述具体情况。
我在MongoDB中使用固定大小写敏感的MAC地址格式,例如12:34:56:78:9a:bc
。我们知道12:34:56:78:9a:bc
,12:34:56:78:9A:BC
,12-34-56-78-9A-BC
和123456789abc
对我们和物理表示都是相同的值,但是在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()
仅适用于列表在循环时使用索引访问其元素。我想念的是什么?
答案 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