【问题标题】:How to add decimals after every 3 digit starting from right side in a list having tuple of numbers?如何在具有数字元组的列表中从右侧开始每 3 位数字后添加小数?
【发布时间】:2019-12-07 23:24:28
【问题描述】:

我有一个包含元组的列表。我想把小数点放在从右边开始的每 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)]

【问题讨论】:

  • 感谢大家的快速响应。所有解决方案都是有用的。

标签: python python-3.x string ip-address


【解决方案1】:

这是一种方法。

例如:

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

【讨论】:

    【解决方案2】:

    所以遍历每个元组,然后遍历每个 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')]
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这是我的看法:

        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)
        

        【讨论】:

          【解决方案5】:
          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')]
          >>> 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多