全部Python个拼音(普通话拼音)排列组合

All Python Permutations and Combinations of Pinyin (Mandarin Romanization)

我想做一个单调拼音列表combinations/permutations。

import pandas as pd
data = pd.read_csv('chinese_tones.txt', sep=" ", header=None)
data.columns = ["pinyin", "character"]
data['pinyin'] = data['pinyin'].str.replace('\d+', '')

当前数据格式为:

| pinyin| character|
|------|----|---|---|---|
| cang | 仓 |   |   |   |
| cang | 藏 |   |   |   |
| cao  | 操 |   |   |   |
| cao  | 曹 |   |   |   |
| cao  | 草 |   |   |   |

预期结果将是如下列表:

cangcang
cangcao
caocang
caocao

我可以重复删除列表并清理自己。我只是想在两个拼音的每个顺序中包含每个组合。

您可以drop_duplicates,然后使用outer加法得到所有组合。

import numpy as np
import pandas as pd

s = df['pinyin'].drop_duplicates().to_numpy()
pd.Series(np.add.outer(s, s).ravel())

#0    cangcang
#1     cangcao
#2     caocang
#3      caocao
#dtype: object

If you want to add back the original words just add `s` back to this outer addition.

pd.Series(s.tolist() + np.add.outer(s, s).ravel().tolist())
#0        cang
#1         cao
#2    cangcang
#3     cangcao
#4     caocang
#5      caocao
#dtype: object

如果你也想拥有单独的单词,那么我们可以通过合并来完成类似的事情,而不是下降到 numpy。 drop_duplicates 并分配一个临时键来完成整个合并,然后添加字符串。

s = df[['pinyin']].drop_duplicates().assign(key=1)
res = s.merge(s, on='key').drop(columns='key')
res['combined'] = res['pinyin_x'] + res['pinyin_y']

#  pinyin_x pinyin_y  combined
#0     cang     cang  cangcang
#1     cang      cao   cangcao
#2      cao     cang   caocang
#3      cao      cao    caocao