我有一个代表完整列表的列表:
complete_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
并且带有行的列表(或numpy数组)列表缺少某些项:
list_1 = [['a', 'b', 'c', 'd', 'e'],
['e', 'f', 'g', 'h'],
['a', 'b', 'c', 'g', 'h']]
我想突出显示缺少的项目,例如N/A
喜欢:
list_1 = [['a', 'b', 'c', 'd', 'e', 'N/A', 'N/A', 'N/A'],
['N/A', 'N/A', 'N/A', 'N/A', 'e', 'f', 'g', 'h'],
['a', 'b', 'c', 'N/A', 'N/A', 'N/A', 'g', 'h']]
是否有numpy中的内置解决方案来实现? pythonic解决方案会是什么样子?目前,我在两个循环中填充了一个空的numpy数组(大小事先已知)。
答案 0 :(得分:2)
通过简单的成员资格测试:
complete_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
lst = [['a', 'b', 'c', 'd', 'e'],
['e', 'f', 'g', 'h'],
['a', 'b', 'c', 'g', 'h']]
res = [['N/A' if c not in sub_lst else c for c in complete_list]
for sub_lst in lst]
print(res)
输出:
[['a', 'b', 'c', 'd', 'e', 'N/A', 'N/A', 'N/A'], ['N/A', 'N/A', 'N/A', 'N/A', 'e', 'f', 'g', 'h'], ['a', 'b', 'c', 'N/A', 'N/A', 'N/A', 'g', 'h']]
答案 1 :(得分:1)
可以实现的主要逻辑是:
for lists in list_1:
for i, x in enumerate(complete_list):
try:
if lists[i] != x:
lists.insert(i,'N/A')
except IndexError:
lists.append('N/A')
但是它的时间复杂度是O(m * n)。我正在努力减少它。
更新:经过一些修改,我在这里有了更好的解决方案。多数民众赞成在这里:
complete_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
complete_len = len(complete_list)
list_1 = [['a', 'b', 'c', 'd', 'e'],
['e', 'f', 'g', 'h'],
['a', 'b', 'c', 'g', 'h']]
for list_ in list_1: #for each list in list_1
for i in range(complete_len):
if list_[i] == complete_list[i]:
if i != len(list_)-1:
continue
else: #appends last elements and exit(case list_1[0])
list_ += ['N/A']*(complete_len-len(list_))
break
else:
list_.insert(i,'N/A')
if len(list_) == complete_len:
break
for list_ in list_1:
print(list_)
输出:
['a', 'b', 'c', 'd', 'e', 'N/A', 'N/A', 'N/A']
['N/A', 'N/A', 'N/A', 'N/A', 'e', 'f', 'g', 'h']
['a', 'b', 'c', 'N/A', 'N/A', 'N/A', 'g', 'h']