如何从列表中的元组开始,每3位数开始添加小数



我的列表有元组。我想将元组的每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')]
>>> 

最新更新