Python有趣的小程序 - 起名字的困扰

91 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问 题 ?

今天,ofter在为公司起名字的时候,随手写了几个字,感觉不够高大上,然后就越写越多,想试试用排列组合的方式。当文字越来越多的时候,脑子好像不够用了,组合来组合去,摸不着头脑,于是突发奇想搞个小程序,把所有的文字排列组合出来,我就看结果挑选。

\


思 路 ⭐

对于一个初学小白来说,编程最重要的是思路,要编写一个排列组合的小程序,我们需要先列一下功能需求点:

1、文字写在程序上,或从excel上读取;

2、对文字进行排列组合有什么要求,需要什么函数?

3、排列组合的结果输出到excel上。

将一个程序通过几个步骤拆分后,然后就找能够实现的函数,直接上手编写调试就可以了。


实 现

场景A:1文字写在程序上 - 2排列组合(itertools) - 3输出

第1次调试

import itertools
list2 = ['柏','松','诚','精','成','一','名','明','思','远']
df = list(itertools.product(list2, repeat=2))
print(df)

输出结果:

[('柏', '柏'), ('柏', '松'), ('柏', '诚'), ('柏', '精'), ('柏', '成'), ('柏', '一'), ('柏', '名'), ('柏', '明'), ('柏', '思'), ('柏', '远'), ('松', '柏'), ('松', '松'), ('松', '诚'), ('松', '精'), ('松', '成'), ('松', '一'), ('松', '名'), ('松', '明'), ('松', '思'), ('松', '远'), ('诚', '柏'), ('诚', '松'), ('诚', '诚'), ('诚', '精'), ('诚', '成'), ('诚', '一'), ('诚', '名'), ('诚', '明'), ('诚', '思'), ('诚', '远'), ('精', '柏'), ('精', '松'), ('精', '诚'), ('精', '精'), ('精', '成'), ('精', '一'), ('精', '名'), ('精', '明'), ('精', '思'), ('精', '远'), ('成', '柏'), ('成', '松'), ('成', '诚'), ('成', '精'), ('成', '成'), ('成', '一'), ('成', '名'), ('成', '明'), ('成', '思'), ('成', '远'), ('一', '柏'), ('一', '松'), ('一', '诚'), ('一', '精'), ('一', '成'), ('一', '一'), ('一', '名'), ('一', '明'), ('一', '思'), ('一', '远'), ('名', '柏'), ('名', '松'), ('名', '诚'), ('名', '精'), ('名', '成'), ('名', '一'), ('名', '名'), ('名', '明'), ('名', '思'), ('名', '远'), ('明', '柏'), ('明', '松'), ('明', '诚'), ('明', '精'), ('明', '成'), ('明', '一'), ('明', '名'), ('明', '明'), ('明', '思'), ('明', '远'), ('思', '柏'), ('思', '松'), ('思', '诚'), ('思', '精'), ('思', '成'), ('思', '一'), ('思', '名'), ('思', '明'), ('思', '思'), ('思', '远'), ('远', '柏'), ('远', '松'), ('远', '诚'), ('远', '精'), ('远', '成'), ('远', '一'), ('远', '名'), ('远', '明'), ('远', '思'), ('远', '远')]

看到这个输出结果,第一个输出('柏', '柏'),嗯~ o( ̄▽ ̄)o,这种不太好,不想要这种两个重复的,我们到itertools的官网看看有没有什么函数能直接解决的,不需要再次加工的。

itertools - Functions creating iterators for efficient looping - Python 3.9.6 documentation​docs.python.org/3/library/itertools.html

不懂英文不要紧,看看Examples例子,这个permutations可以实现我们的诉求。

第2次调试

import itertools
list2 = ['柏','松','诚','精','成','一','名','明','思','远']
df = list(itertools.permutations(list2, 2))
print(df)

输出结果:

[('柏', '松'), ('柏', '诚'), ('柏', '精'), ('柏', '成'), ('柏', '一'), ('柏', '名'), ('柏', '明'), ('柏', '思'), ('柏', '远'), ('松', '柏'), ('松', '诚'), ('松', '精'), ('松', '成'), ('松', '一'), ('松', '名'), ('松', '明'), ('松', '思'), ('松', '远'), ('诚', '柏'), ('诚', '松'), ('诚', '精'), ('诚', '成'), ('诚', '一'), ('诚', '名'), ('诚', '明'), ('诚', '思'), ('诚', '远'), ('精', '柏'), ('精', '松'), ('精', '诚'), ('精', '成'), ('精', '一'), ('精', '名'), ('精', '明'), ('精', '思'), ('精', '远'), ('成', '柏'), ('成', '松'), ('成', '诚'), ('成', '精'), ('成', '一'), ('成', '名'), ('成', '明'), ('成', '思'), ('成', '远'), ('一', '柏'), ('一', '松'), ('一', '诚'), ('一', '精'), ('一', '成'), ('一', '名'), ('一', '明'), ('一', '思'), ('一', '远'), ('名', '柏'), ('名', '松'), ('名', '诚'), ('名', '精'), ('名', '成'), ('名', '一'), ('名', '明'), ('名', '思'), ('名', '远'), ('明', '柏'), ('明', '松'), ('明', '诚'), ('明', '精'), ('明', '成'), ('明', '一'), ('明', '名'), ('明', '思'), ('明', '远'), ('思', '柏'), ('思', '松'), ('思', '诚'), ('思', '精'), ('思', '成'), ('思', '一'), ('思', '名'), ('思', '明'), ('思', '远'), ('远', '柏'), ('远', '松'), ('远', '诚'), ('远', '精'), ('远', '成'), ('远', '一'), ('远', '名'), ('远', '明'), ('远', '思')]

Perfect! 没想到就10个字,能有那么多组合,要是自己一个个列,也是要花费点时间。但是这个看起来不太方便啊,每次还要去改程序中的文字,运行的结果看起来也不是很直观啊,放到excel上看吧。

场景B:1文字写在excel - 2排列组合(itertools) - 输出到excel

第3次调试

注意:excel中list是存不进去的,需要用DataFrame,所以引入DataFrame库

import itertools
import pandas as pd
from pandas.core.frame import DataFrame
df = pd.read_excel('./data/test1.xlsx',sheet_name='Sheet1') 
df = DataFrame(itertools.permutations(df['文字'], 2))
df.to_excel('./data/test2.xlsx',sheet_name="sheet3")

输出结果:(截取了部分)

看起来也不够直接,0列和1列合并下吧。

第4次调试

import itertools
import pandas as pd
from pandas.core.frame import DataFrame
df = pd.read_excel('./data/test1.xlsx',sheet_name='Sheet1') 
df = DataFrame(itertools.permutations(df['文字'], 2))
df['文字组合']=df[0]+df[1]
df.to_excel('./data/test2.xlsx',sheet_name="sheet3")

输出结果:(截取了部分)