假设我有一个开始列表:
<header>header</header>
<main>
<article>content</article>
<article>content</article>
<article>content</article>
<article>content</article>
<article>content</article>
<article>content</article>
<article>content</article>
</main>
<footer>footer</footer>
我现在选择从以下位置的列表中删除/删除三个项目:
SELECT TableA.id AS tableA_id, -- Or anything you want to name it after 'AS'
TableB.id AS tableB_id
FROM TableA
INNER
JOIN TableB
ON TableA.key = TableB.key
使用Numpy可以通过以下方式完成
:start_list = [0, 2, 3, 5, 6, 10, 11, 14, 20]
现在,我希望返回remove_list = [0, 3, 5]
的原始结构,但是当然要删除与之不同的值,即类似这样的东西:
>> final_list = np.delete(start_list, remove_list, axis=0)
[2, 3, 6, 11, 14, 20]
因此删除的索引现在已恢复为与开头相同的排列,但是删除的值现在已替换为零。
如果我使用类似start_list
的东西,则会得到一个新列表,在new_list = [0, 2, 3, 0, 6, 0, 11, 14, 20]
的索引位置插入零。但是,这是相对于numpy.insert(final_list, remove_list, 0)
索引而言的,因此其结尾为:
remove_list
显然与final_list
不同。
如果我像这样迭代:
new_list = [0, 2, 3, 6, 0, 11, 14, 0, 20]
最后我得到了三个数组,其中每个索引中的start_list
的索引中都插入了一个零。
所以基本上,我只是想从new_final_list = [np.insert(final_list, k, 0) for k in remove_list]
“重新创建” remove_list
,但是要删除的值的位置为零。
答案 0 :(得分:3)
对enumerate
使用列表理解:
new_list = [x if i not in remove_list else 0 for i, x in enumerate(start_list)]
print(new_list)
#[0, 2, 3, 0, 6, 0, 11, 14, 20]
答案 1 :(得分:0)
In [453]: start_list = [0, 2, 3, 5, 6, 10, 11, 14, 20]
In [454]: remove_list = [0, 3, 5]
如果我们从start_list
中创建一个数组,则很容易用新值(例如0)替换选定的项。删除并重新插入是困难的方法:
In [455]: arr = np.array(start_list)
In [456]: arr[remove_list] = 0
In [457]: arr
Out[457]: array([ 0, 2, 3, 0, 6, 0, 11, 14, 20])
通过列表理解,从列表中删除项目很容易。这是@pault的替换理解的一种变体:
In [458]: [x for i,x in enumerate(start_list) if i not in remove_list]
Out[458]: [2, 3, 6, 11, 14, 20]
np.delete
可以从数组(或将列表变成数组)中删除项目,但是在内部它很复杂(由于其通用性)。我认为在这种情况下,它仅使用布尔掩码:
In [459]: mask = np.ones(len(start_list), bool)
In [460]: mask[remove_list] = False
In [461]: mask
Out[461]: array([False, True, True, False, True, False, True, True, True])
In [462]: arr[mask]
Out[462]: array([ 2, 3, 6, 11, 14, 20])
明智的选择时间,如果您从列表开始,坚持列表会更快。创建数组会产生开销,而诸如此类的操作无法克服。
可以通过切片从列表中删除元素
In [464]: for i in remove_list[::-1]:
...: start_list[i:i+1] = []
...:
In [465]: start_list
Out[465]: [2, 3, 6, 11, 14, 20]
但是我们必须从remove_list
的末尾开始,以避免弄乱计数。这是一个相对知名的Python列表习惯用法。
我们可以以相同的方式将元素插入列表,但是我们必须调整索引以适应中间大小。
In [483]: insert_list = [i-j for i,j in zip(remove_list,range(3))]
In [484]: start_list=[2,3,6,11,14,20]
In [485]: for i in insert_list[::-1]:
...: start_list[i:i] = [0]
...:
...:
In [486]: start_list
Out[486]: [0, 2, 3, 0, 6, 0, 11, 14, 20]
我通过反复试验得出了insert_list
,并从期望的结果中进行了尝试。