如何在具有数字元组的列表中从右侧开始的每 3 位数字后添加小数点?

How to add decimals after every 3 digit starting from right side in a list having tuple of numbers?

我有一个包含元组的列表。我想在从右开始的元组的每 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`

输出格式:

[(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)]

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'.', 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')]
>>>