Все перестановки 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

Я могу дедуплицировать список и очистить себя. Я просто пытаюсь включить каждую комбинацию в каждый порядок двух пиньинь.

1 ответ

Вы можете , а затем использовать 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
Другие вопросы по тегам