通过使用Python将类似的术语添加在一起,对大块文本进行排序



这是一个数据块示例。

1med,2obs,3soc,1sed,3rhe,2hyp,1inti,1tea,1bod,4sto,1aur,1med,1sin,1ded,5obs
1act,4sed,3per,2inte,2soc,3dan,1intel,3lea,1intel,1inte,3aur,2soc,2neg,3log
2sed,5tea,3her,1medi,1pla,3rhe,3rid,3soc,2swi,3tea,1wri,3obs,3hyp,2aur,1tac
2per,2med,3pla,4intel,3dag,3act,2tac,4obs,1shi,1aur,1medi,1ste,1una,1bra,1hyp
3act,1dan,3ded,5intel,1inte,3inv,1medi,3obs,2soc,1spi,2ste,3rea,3wri,3mat
1intel,4obs

通过我自己的一些研究,我已经找到了如何以明显和常见的方式进行分类。例如,我可以按字母顺序排序,也可以按数字排序,或者其他各种不同的排序方法。

然而,我想把相似的术语和排序结合起来。我找不到任何关于组合相似术语的参考。例如,如果数据包括:

1med,2obs,2obs,1med,5rhe

然后,在程序处理数据后,输出将显示如下:

2med
4obs
5rhe

我错过了什么?

我使用了原始列表的一个小得多的版本,因为你没有引用字符串,所以我不能只是复制和粘贴它,但你已经明白了。

>>> original_list
['1med', '2obs', '3soc', '2hyp', '1inti', '3med', '4soc']
>>> counter = {}
>>> for item in original_list:
...   try:
...     counter[item[1:]] += int(item[0])
...   except KeyError:
...     counter[item[1:]] = int(item[0])
... 
>>> counter
{'med': 4, 'obs': 2, 'hyp': 2, 'soc': 7, 'inti': 1}
>>> for k,v in counter.items():
...   print('%s%s' % (v, k))
... 
4med
2obs
2hyp
7soc
1inti

通过在数字(item[1:])后面进行切片来分割字符串,然后将该数字添加到dict中存储的计数(int(item[0]))中,如果还没有,则使用该数字作为值(except KeyError)。

使用正则表达式可以检测数字和字母。然后将它们的计数存储在dict中,并在最后进行组合。

my_str = "1med,2obs,2obs,1med,5rhe"
import re
data_as_lst = my_str.split(',')
words_dct = {}
for chunk in data_as_lst:    
    word = re.findall(r'[a-zA-Z]+', chunk)[0]
    num = int(re.findall(r'[0-9]+', chunk)[0])
    if word not in words_dct:
        words_dct.update({word: num})        
    else:
        words_dct[word] += num
results = []
for word in words_dct:
    results.append(str(words_dct[word]) + word)
print(results)

可能没有其他人建议的切片那么快(我错过了第一个字符总是个位数的评论),但它适用于任何数字。

thelist = ['1med', '2obs', '3soc', '1sed', '3rhe', '2hyp', '1inti', '1tea', '1bod', '4sto', '1aur', '1med', '1sin', '1ded', '5obs', '1act', '4sed', '3per', '2inte', '2soc', '3dan', '1intel', '3lea', '1intel', '1inte', '3aur', '2soc', '2neg', '3log', '2sed', '5tea', '3her', '1medi', '1pla', '3rhe', '3rid', '3soc', '2swi', '3tea', '1wri', '3obs', '3hyp', '2aur', '1tac', '2per', '2med', '3pla', '4intel', '3dag', '3act', '2tac', '4obs', '1shi', '1aur', '1medi', '1ste', '1una', '1bra', '1hyp', '3act', '1dan', '3ded', '5intel', '1inte', '3inv', '1medi', '3obs', '2soc', '1spi', '2ste', '3rea', '3wri', '3mat', '1intel', '4obs']
list_dict = {x[1:]: x[0] for x in thelist}

只要前缀号大于0且<10.

然后,如果你想把所有这些都打印出来,你可以做一个列表理解,尽管字典可能会更好。

recombined = [str(list(list_dict.values())[y])+list(list_dict.keys())[y] for y in range(len(list(list_dict.values())))]
for each in recombined:
    print(each)

为了把它变成一个列表,我没有使用Python,而是简单地用Notepad++强制它。我做了ctrl+h(查找并替换),搜索逗号(,),并替换为引号逗号引号(',')。

如果你需要定期这样做,请考虑将信息作为CSV文件读取,并在进行词典理解之前将数据添加到列表中。

最新更新