【问题标题】:How to write Python code for generating Italian car number plates?如何编写用于生成意大利车牌的 Python 代码?
【发布时间】:2022-11-24 05:17:29
【问题描述】:

三位数字先变化,然后字母从右到左变化。所以,第一个板是 AA 000 AA,然后是 AA 001 AA...AA 999 AA,然后是 AA 000 AB 到 AA 999 AZ,然后是 AA 000 BA 到 AA 999 ZZ,然后是 AB 000 AA 到 AZ 999 ZZ,然后是 BA 000 AA 到 ZZ 999 ZZ。

【问题讨论】:

  • 考虑将解决方案编写为嵌套的 for 循环。
  • 它代表了大量的组合。也许你可以使用发电机。
  • 车牌格式和顺序清晰。不清楚的是您需要对输出进行哪些操作——您对整个序列、第 n 个元素、随机元素感兴趣吗?

标签: python


【解决方案1】:

只需使用几个 for 循环。但这是一个非常大的输出(456_976_000 行):

from string import ascii_uppercase as letters

for l1 in letters:
    for l2 in letters:
        for l3 in letters:
            for l4 in letters:
                for i in range(1000):
                    print(f'{l1}{l2} {i:03d} {l3}{l4}')

【讨论】:

  • 这比我为非常具体的问题提出的解决方案要好得多。我打算将解决方案编写为一组如上所述的嵌套循环,但不知何故偏离了这种方法。我肯定通过 ascii_letters 值学到了一些新东西。
  • 我只是在调查 ascii_letters ,结果发现它包括大写和小写,所以你必须稍微修改你的代码。也许添加一行letters = letters[:26]
  • @Mark哦,你是对的,谢谢。显然,虽然有 ascii_uppercase :)
  • 是的,更新了:)
  • 对我的建议很酷的改进。现在我学到了第二件事!
【解决方案2】:

我建议编写一个函数,根据数字 n 计算第 n 个车牌的字符串:

def numberplate(i):
    chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # Remove invalid ones
    c = len(chars)
    return chars[i//1000//c**3] + chars[(i//1000%c**3)//c**2] + "{:03d}".format(i%1000) +  chars[(i//1000%c**2)//c] + chars[i//(1000)%c**1]

print(numberplate(0))
print(numberplate(456))
print(numberplate(1000))
print(numberplate(1335))
print(numberplate(1000*26**4-1))

# The below will run for a while...
for i in range(1000*26**4):
    print(numberplate(i))

编辑:我不是故意使用ascii_uppercase,因为在许多国家/地区,牌照中不允许使用 O 和 I 等字符。

【讨论】:

    【解决方案3】:

    这是解决此问题的合理通用方法:

    digits = [ 
      # value, init, count, suffix, order 
      [ 'A', 'A', 26 , '',  6], 
      [ 'A', 'A', 26 , ' ', 5], 
      [ '0', '0', 10, '', 2 ], 
      [ '0', '0', 10, '', 1 ], 
      [ '0', '0', 10, ' ', 0 ], 
      [ 'A', 'A', 26 , '',  4], 
      [ 'A', 'A', 26 , '', 3], 
    ]
    
    def plate(digits):
      out = []
      for item in digits:
        out.append( item[0] )
        out.append( item[3] )
    
      return ''.join(out)
    
    def increment(digits):
      digits = sorted(digits, key = lambda x : x[-1] )
      for item in digits:
        v =  ord(item[0]) + 1   
        item[0] = chr(v) 
        if v <  ord(item[1]) + item[2]:
          break
        item[0] = item[1]
        
         
        
      
    
    value = plate( digits ) 
    while value != 'ZZ 999 ZZ':
      print(value)
      increment(digits)
      value = plate( digits ) 
    print(value)
    

    string 和 int 之间有很多转换。我也每次都在构建输出字符串,所以它有点慢。

    产量很大。大约有 4.57 亿个输出值 ( 26^4 * 10^3 )。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 2020-02-23
      相关资源
      最近更新 更多