首页 > 解决方案 > 如何用“NA”填写两个列表之间的差异

问题描述

我有一堆我必须比较的cpythone列表,在这种情况下,e列表长度总是大于或等于c列表。我想做的是比较这两个列表,如果它们的长度不相等,我想c用“NA”填写列表“间隙”。

例如,如果我们查看这两个列表:

e = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14']
c = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13']

我希望 c 列表为它缺少的值填写“NA”(并保留顺序),如下所示:

c = ['NA', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', 'NA']

标签: pythonlist

解决方案


我会用熊猫和pd.Series.where面具。首先将它们转换为 series e = pd.Series(e),然后

s = pd.concat([e,c],sort=True).drop_duplicates() #remove sort=True for versions < 0.23
s.where(s.isin(c))

输出

0     NaN
1       2
2       3
3       4
4       5
5       6
6       7
7       8
8       9
9      10
10     11
11     12
12     13
13    NaN

您还可以遵循经典的纯 Python 方法。使用两个指针,同时遍历它们并比较值。

p1 = 0
p2 = 0

f = []
while (p1 < len(e)) and (p2 < len(c)):

    vale = e[p1]
    valc = c[p2]

    if vale < valc: 
        f.append('NA')
        p1 += 1
    elif vale == valc:
        f.append(valc)
        p1 += 1
        p2 += 1
    else:
        p2 += 1

    if p1 == len(e): f.extend(c[p2:])
    if p2 == len(c): f.extend(['NA']*(len(e)-p1))

推荐阅读