首页 > 解决方案 > 拼音的所有 Python 排列组合(普通话罗马化)

问题描述

我正在寻找一个无声拼音组合/排列的列表。

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

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

标签: pythonpandaslist-comprehensionpinyin

解决方案


您可以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

推荐阅读