删除列表中小于 3 位的数字,同时项目数量保持不变

Delete numbers smaller then 3 digits in a list while amount of items stays the same

我想规范化包含年份的列表。重要的是 列表中的项目数量保持不变 ,因为我要将列表转换为数据框并且行需要与其他变量对齐。这是我的清单。它包含许多不同的方式来标记年份:

['1817 (1817p)', '1800-1824 (19.1q)', '1825-1849', 'ca. 1850', '1856–60', '1861-07-XX', 'copied between 1824 and 1845', 'copied d. 14tn Merz 1767', '1718']

现在,我只想为列表中的每个项目获得 1 年。例如:

['1817', '1800', '1825', '1850', '1856', '1861', '1824', '1767', '1718']

如果1项中有两年,则选择第一年。 (如果列表中有 2 项,如果你能得到平均值,则加分。)

为了得到想要的结果,我删除了括号内的所有内容并将“-”替换为空格。

import re

data2 = []

for i in data:
    df8 = re.sub(r"\([^()]*\)", "", i)
    df10 = re.sub((r'\–'), " ", df8)
    df11 = re.sub((r'\-'), " ", df10)
    data2 += [df11]
print(data2)

输出 1:

['1817 ', '1800 1824 ', '1825 1849', 'ca. 1850', '1856 60', '1861 07 XX', 'copied between 1824 and 1845', 'copied d. 14tn Merz 1767', '1718']

然后我遍历了这些项目,但最终列表中的项目比开始时更多。

ls = data2
ls2 = []
 
for i in ls:
    res = re.findall(r'\w+', i)
    for w in res:
        if len(w) > 3:
            ls2.append(w)
print(ls2)

输出 2:

['1817', '1800', '1824', '1825', '1849', '1850', '1856', '1861', 'copied', 'between', '1824', '1845', 'copied', '14tn', 'Merz', '1767', '1718']

我能想到的是结合使用 regex 和 numpy 模块:

import re
import numpy as np
myList = ['1817 (1817p)', '1800-1824 (19.1q)', '1825-1849', 'ca. 1850', '1856–60', '1861-07-XX', 'copied between 1824 and 1845', 'copied d. 14tn Merz 1767', '1718']
[np.array(re.findall("\d{4}",x)).astype("int").mean() for x in myList]

输出

[1817.0, 1812.0, 1837.0, 1850.0, 1856.0, 1861.0, 1834.5, 1767.0, 1718.0]

这实际上为您提供了列表中每个元素中数字的平均值。