# 用Python组合ENS回文域名

By [DFarm](https://paragraph.com/@dfarm) · 2022-09-12

---

昨天有人在微信里找我帮忙：

![](https://storage.googleapis.com/papyrus_images/e0121eb62192fb6614db7376abc34368554d6190494a54b839ca1705d5d1cdef.png)

我们就用这个需求，来巩固一下之前学过的 Python 基础知识。

循环组合
----

需求很简单：26 个字母取 3 位组合，后面加上两位对应的字母组成回文。

什么是回文？就是 12321、abcba 这种组合。

所以我们只需要确认前三位就可以了，三种字母组合有多少种呢？26x26x26=17576种组合，这个组合要怎么写呢，就要用到之前学过的 for 循环了，废话少数，上代码！

    list = 'abcdefghijklmnopqrstuvwxyz'  # 首先列出26个字母
    words = []  # 创建一个空的列表，用来存放所有结果
    for item_1 in list:  # 循环第1位字母
        for item_2 in list:  # 循环第2位字母
            for item_3 in list:  # 循环第3位字母
                word = item_1 + item_2 + item_3  # 将3个位置的字母组合，组成word
                words.append(word)  # 将所有word添加到words这个列表中
    print(len(words))  # 打印所有结果的数量
    

上面的代码非常简单，每一行注释都写清楚了，执行之后，会打印出17576这个数字。

需求变更
----

如果你执行上面的代码，打印所有 word 的时候，可以看到会有 aab 或者 baa 这种组合，出现了重复字母。

对方需求表示前三位的字母不可重复：

![](https://storage.googleapis.com/papyrus_images/a77aa47b63d678e573c4c8fc7fbef417c4fa81c05f9244903fd8c7c593885580.png)

这次需求更改之后，总量变成15600了，那么代码应该怎么写呢？

其实思路很简单，还是三次循环，每次后一位循环去掉前一位用过的字母即可。

但是这么写很累啊，都说 Python 很简单，没有简单办法吗？当然有！我们用 itertools 来写！

    import itertools
    
    list = itertools.permutations("abcdefghijklmnopqrstuvwxyz", 3) 
    words = []
    for item in list:
        words.append(item)
    print(len(words))
    

首先解释一下 permutations 是啥意思：

![](https://storage.googleapis.com/papyrus_images/e6b5de01e41cab812bd7f5145b28ac830a8ad4d7947800ee4748b73bc2323862.png)

itertools 非常强大，关于 itertools 的更多方法和解释，完整说明可以参考这篇文章：

[

itertools -- 高效迭代器│Python标准库
----------------------------

前情提示: 测试代码中，右尖括号（&gt;）表示命令行中输入的命令； 单独一行并以井字符（#）开头的为输出内容； 库的导入仅在本文的第一个测试代码中展现，其...

https://segmentfault.com

![](https://storage.googleapis.com/papyrus_images/b2a217e939b409cb86f0eebb657535d91c9ca4487cd03993c640e0842695c7e2.webp)

](https://segmentfault.com/a/1190000038925492)

总量15600跑完了，这次终于对了吗？

需求再次变更
------

我跑了一遍数据，发现这15600里面1.4万都没注册：

![](https://storage.googleapis.com/papyrus_images/6381447e811a38698e4a4fa1851e1ee6fcf4d76f7a322eb1f09288694f3c181a.png)

他说的回文变成了 ababa 这种。

再次分析这个需求，前三位 aba 本身就是一个回文，也就是说前两位字母排序且不重复即可。

那么非常简单，只需要将上一节的代码变量 3 改成 2 即可：

![](https://storage.googleapis.com/papyrus_images/2e52a2f2b09763cf739b920e341ea941d570b62b29ee48d0d72f4cd553b0c9dc.png)

这650个就是最终需要的结果了，现在我们把域名拼接完整，把他们打印出来：

    import itertools
    
    list = itertools.permutations("abcdefghijklmnopqrstuvwxyz", 2)
    words = []
    for item in list:  # item 这里item是列表，需要循环读取成字符串
        word = ""
        for letter in item:
            word = word + letter
        #  此时已经搞到两位字母组合，只需要拼接后面的内容
        word = word + word[0] + word[1] + word[0]  # 这里第一个word就是两位字母，后面反复加上他们的第一位字母和第二位字母即可
        print(word)
        words.append(word)
    

运行代码之后，你的 Run 窗口应该有以下的内容打印：

![](https://storage.googleapis.com/papyrus_images/a793963d9170fd83d8745967381537ddee540681be803d28c9ad397a6078bbbe.png)

注册状态查询和批量注册
-----------

查这些域名有没有被注册了，后面可以写代码完成，也可以直接复制内容粘贴到：[https://rare.id/](https://rare.id/) 即可

![](https://storage.googleapis.com/papyrus_images/3b689f81703b7f8bce54a054543ebb4f9f9c620368e3c3a3802faaae7cd9feca.png)

结果不出意外：

![](https://storage.googleapis.com/papyrus_images/e794c479c75235c713bd8e1cd0985d846c51d7d180ac6d9c578fcbce3f8fdc2a.png)

650条记录全部被注册了，本来剩下了几十个，我那个朋友注册走了。

最后
--

市面上虽然有很多帮你组合的工具，但是要满足你的特殊要求往往还是自己写代码最快。

全部需求完成，只用了12行代码，效率很高。当然本文不一定是最优解，完成这个需求还有很多种解法。

以上只是 Python 应用的一个小场景，希望对你有所帮助。

**本文只是以回文举例，不表示回文域名值得投资，市场有风险，投资需谨慎。**

---

*Originally published on [DFarm](https://paragraph.com/@dfarm/python-ens)*
