我的列表有元组。我想将元组的每3位数字之间的小数点放在右边。
。输入:
[(172031028000, 171031011000), (10010043016, 171031011111), (172031028011, 172031031121)]
输出:
[(172.031.028.000, 171.031.011.000), (10.010.043.016, 171.031.011.111), (172.031.028.011, 172.031.031.121)]
注意:必须将小数从右侧放置,只有它们是IP
我认为,如果我可以一个一个访问每个元素,则从右侧开始3位数字,然后用小数点连接,最后以相同的格式将它们放回原处。这是我现在的想法,但也可能有更好的方法来做到这一点。
我试图用一个数字进行测试,但我不确定如何为元组中的每个元素做到这一点。
num = "123456789032"
n = 3
x = num[-3:]
y = num[-6:-3]
z = num[-9:-6]
aa = num[:-9]`enter code here`
outformat:
[(172.031.028.000, 171.031.011.000), (10.010.043.016, 171.031.011.111), (172.031.028.011, 172.031.031.121)]
这是一种方法。
ex:
data = [(172031028000, 171031011000), (10010043016, 171031011111), (172031028011, 172031031121)]
result = []
for i in data:
temp = []
for j in i:
val = str(j)[::-1] #Reverse string
# convert string to chunks of 3 and join
temp.append(".".join(val[m:m+3] for m in range(0, len(str(val)), 3))[::-1])
result.append(tuple(temp)) #Append to result.
print(result)
输出:
[('172.031.028.000', '171.031.011.000'),
('10.010.043.016', '171.031.011.111'),
('172.031.028.011', '172.031.031.121')]
,因此在每个元组上进行迭代,然后在每个IP上进行迭代。您有正确的IP部分,因此将其添加到一个临时列表中,您将要投入培训(因为元组是不可变的,因此您无法更改已经拥有的内容(
tup=[(172031028000, 171031011000), (10010043016, 171031011111), (172031028011, 172031031121)]
for j,t in enumerate(tup):
a=[]
for ip in t:
s=str(ip)
x = s[-3:]
y = s[-6:-3]
z = s[-9:-6]
aa = s[:-9]
formatted='{}.{}.{}.{}'.format(aa,z,y,x)
a.append(formatted)
tup[j]=tuple(a)
print(tup) # [('172.031.028.000', '171.031.011.000'), ('10.010.043.016', '171.031.011.111'), ('172.031.028.011', '172.031.031.121')]
re
模块的一个可能版本:
data = [(172031028000, 171031011000), (10010043016, 171031011111), (172031028011, 172031031121)]
import re
from pprint import pprint
pprint([tuple(map(lambda v: re.sub(r'(d{3})(?!$)', r'1.', str(v)[::-1])[::-1], d)) for d in data])
打印:
[('172.031.028.000', '171.031.011.000'),
('10.010.043.016', '171.031.011.111'),
('172.031.028.011', '172.031.031.121')]
这是我的看法:
data = [(172031028000, 171031011000), (10010043016, 171031011111), (172031028011, 172031031121)]
# Add the dots to the IP
def proc_ip(a: int):
a = str(a)
return f'{a[:3]}.{a[3:6]}.{a[6:9]}.{a[9:]}'
# Add the dots to both ips on the tuple
def proc_tuple(a: tuple):
return (proc_ip(a[0]), proc_ip(a[1]))
# Process each tuple
result = [proc_tuple(elem) for elem in data]
print(result)
def convert(num):
num = str(num)
return '{}.{}.{}.{}'.format(num[:-9], num[-9:-6], num[-6:-3], num[-3:])
这是一个简单的基于您的代码的衬里转换器。;(num=str(num)
使用切片符号 - 在发布元组列表时,您将数字作为整数发布,而测试是在字符串上。
如果我们将切片包裹在int()
中,我们可以摆脱过时的零。(127.000.000.001将成为127.0.0.1(:
def convert(num):
num = str(num)
return '{}.{}.{}.{}'.format(int(num[:-9]), int(num[-9:-6]), int(num[-6:-3]), int(num[-3:]))
现在,要转换您的列表,让我们使用列表理解!那使另一个衬里。
列表理解基本上是压缩简单的for
循环。
input_list = [(172031028000, 171031011000), (10010043016, 171031011111), (172031028011, 172031031121)]
output_list = [(convert(num1), convert(num2)) for num1, num2 in input_list]
print(output_list)
两个版本都如下所示:
>>> def convert(num):
... num = str(num)
... return '{}.{}.{}.{}'.format(num[:-9], num[-9:-6], num[-6:-3], num[-3:])
...
>>> input_list = [(172031028000, 171031011000), (10010043016, 171031011111), (172031028011, 172031031121)]
>>>
>>> output_list = [(convert(num1), convert(num2)) for num1, num2 in input_list]
>>> print(output_list)
[('172.031.028.000', '171.031.011.000'), ('10.010.043.016', '171.031.011.111'), ('172.031.028.011', '172.031.031.121')]
>>> def convert(num):
... num = str(num)
... return '{}.{}.{}.{}'.format(int(num[:-9]), int(num[-9:-6]), int(num[-6:-3]), int(num[-3:]))
...
>>> input_list = [(172031028000, 171031011000), (10010043016, 171031011111), (172031028011, 172031031121)]
>>>
>>> output_list = [(convert(num1), convert(num2)) for num1, num2 in input_list]
>>> print(output_list)
[('172.31.28.0', '171.31.11.0'), ('10.10.43.16', '171.31.11.111'), ('172.31.28.11', '172.31.31.121')]
>>>