2013-09-04 4 views
1

Есть ли функция в Wolfram Mathematica для удаления элемента из исходного списка? НапримерЕсть ли способ удалить элемент из списка в Mathematica

a={1,2,3}; 
DeleteFrom[a,1]; 
a 

a={2,3} 

Если он отсутствует кто может дать пример эффективного варианта такой функции? (я знаю, что есть функция Delete(), но она будет создавать новый список. Это не хорошо, если список большой)

+0

Если у вас есть хороший критерий, который указывает, когда элемент должен быть удален, вы можете использовать функцию 'Select', которая выбирает элемент NOT, который необходимо удалить. – Hidde

ответ

3

Если вы хотите отбросить первый элемент из списка a заявления

Drop[a,1] 

возвращает список так же, как a без его первого элемента. Обратите внимание, что это не обновляет a. Для этого можно присвоить результат a, например

a = Drop[a,1] 

Обратите внимание, что это, вероятно, именно то, что Delete делает за кулисами; сначала сделав копию a без своего первого элемента, а затем присвоив этому a имя новому списку, а затем освободив память, используемую старым списком.

Сравнение деструктивных обновлений и неразрушающих обновлений в Mathematica довольно сложно и может глубоко проникнуть внутрь внутренних систем. Вы найдете много о предмете на Stack Exchange Mathematica site.

+0

Реальная задача сложнее. Существует большой список (10000000 элементов) данных. Необходимо удалить некоторые элементы из списка некоторыми createria. Обычно необходимо удалить 30-40 процентов элементов. В любом случае, спасибо за ссылку. – user1807338

+0

Вы указываете на одну из серьезных проблем с SO и другими. Вы можете получить ответы только на интересующие вас вопросы, а не на те вопросы, которые вы хотите получить. –

1

Каждый раз, когда вы изменяете длину списка в Mathematica вы вызвать перераспределение списка, который занимает O (N), а не O (1) время , Хотя никакой функции DeleteFrom не существует, если бы это было сделано, это было бы не быстрее, чем a = Delete[a, x].

Если вы можете создать заранее список всех элементов, которые вы хотите удалить, и удалить их все сразу, вы получите гораздо лучшую производительность. Если вы не можете, вам придется найти другой способ сформулировать вашу проблему. Я предлагаю вам присоединиться к нам на правильном сайте Stack Exchange, если у вас есть дополнительные вопросы:

enter image description here

1

Присвоить элемент в пустую последовательность, и она будет удалена из списка. Это работает для любого элемента.

In[1] := a = {1,2,3} 
Out[1]= {1,2,3} 

In[2] := a[[1]] = Sequence[] 
Out[2] = Sequence[] 

In[3] := a 
Out[3] = {2,3} 

Да Mathematica стремится к неразрушающему программирования, но программисты Wolfram довольно умные люди, и код, кажется, бежит довольно быстро. Трудно поверить, что они всегда будут копировать целый список, чтобы изменить один элемент, т. Е. Не делать никаких оптимизаций.

+1

Обратите внимание, что 'Определение [a]' все еще возвращает 'a = {Sequence [], 2, 3}'. Поэтому элемент не удаляется, а заменяется на 'Sequence []'. –

+0

Пустые последовательности уходят, поскольку вы работаете со списком. Примечание b = 1 * a; Определение [b] возвращает b = {2,3}. –

0

Улучшение ответить на user3446498 «s, вы можете сделать следующее:

In[1] := a = {1,2,3}; 

In[2] := a[[1]] = Nothing; 

In[3] := a 
Out[3] = {2,3} 

In[4] := a == {2,3} 
Out[4] = True 

этот Nothing символ был введен в России в 10-й версии (2015), см here.

Смежные вопросы