Вам лучше не удалять элементы во время итерации. Вы можете сделать так:
for word in word_list[:]:
if word[1] in badWords:
word_list.remove(word)
print(word_list)
# [(309, 'răzvan')]
Вы можете прочитать wtfpython , это может помочь вам.
Вызов
List<String> b = new ArrayList<String>(a);
создает неглубокую копию a
в b
. Все элементы будут существовать в b
в том же порядке, в котором они были в a
(при условии, что у него был порядок).
Аналогично, вызов
// note: instantiating with a.size() gives `b` enough capacity to hold everything
List<String> b = new ArrayList<String>(a.size());
Collections.copy(b, a);
также создает неглубокую копию из a
в пределах b
. Если первый параметр, b
, не имеет достаточной емкости (не размера), чтобы содержать все элементы a
, то он выдаст ] IndexOutOfBoundsException
. Ожидается, что для работы Collections.copy
не потребуется никаких выделений, и если таковые имеются, затем он выбрасывает это исключение. Требование предварительного выделения скопированной коллекции ( b
) является оптимизацией, но я обычно не думаю, что эта функция того стоит из-за требуемых проверок с учетом альтернативных конструкторов, подобных показанной выше. не имеют никаких странных побочных эффектов.
Чтобы создать полную копию, список
, с помощью любого механизма, должен обладать сложными знаниями о базовом типе. В случае String
, которые неизменяемы в Java (и .NET в этом отношении), вам даже не нужна глубокая копия. В случае MySpecialObject
вам нужно знать, как сделать его полную копию, и это не обычная операция.
Примечание: первоначально принятый ответ был лучшим результатом для Коллекций .copy
в Google,
Копия не бесполезна, если Вы предполагаете, что вариант использования копирует некоторые значения в существующий набор. Т.е. Вы хотите перезаписать существующие элементы вместо вставки.
Пример: = [1,2,3,4,5] b = [2,2,2,2,3,3,3,3,3,4,4,4], a.copy (b) = [1,2,3,4,5,3,3,3,3,4,4,4]
Однако я ожидал бы метод копии, который возьмет дополнительные параметры для индекса запуска входного и выходного набора, а также параметр для количества.
Посмотрите ОШИБКУ Java 6350752
Если Вы хотите скопировать ArrayList, скопируйте его при помощи:
List b = new ArrayList();
b.add("aa");
b.add("bb");
List a = new ArrayList(b);
List b = new ArrayList(a.size())
не устанавливает размер. Это устанавливает начальную способность (являющийся, сколько элементов это может вписаться, прежде чем это должно будет изменить размер). Более простой способ скопировать в этом случае:
List b = new ArrayList(a);
Просто сделайте:
List a = new ArrayList();
a.add("a");
a.add("b");
a.add("c");
List b = new ArrayList(a);
ArrayList имеет конструктора, который примет, что другой Набор копирует элементы с
b
имеет вместимость 3, но размер 0. Факт это ArrayList
имеет своего рода буферную емкость, деталь реализации - это не часть List
интерфейс, таким образом, Collections.copy(List, List)
не использует его. Это было бы ужасно для него к особому случаю ArrayList
.
Как MrWiggles указал, с помощью конструктора ArrayList, который берет набор, путь к в обеспеченном примере.
Для более сложных сценариев (который может включать Ваш реальный код), можно найти наборы в Гуаве полезными.
самый простой способ скопировать Список состоит в том, чтобы передать его конструктору нового списка:
List<String> b = new ArrayList<>(a);
b
будет мелкая копия a
Рассмотрение источника Collections.copy(List,List)
(Я никогда не видел его прежде), это, кажется, для привыкания индекса элементов индексом. использование List.set(int,E)
таким образом элемент 0 будет по элементу записи 0 в целевом списке и т.д. и т.д. Не особенно ясный из javadocs я должен был бы признать.
List<String> a = new ArrayList<>(a);
a.add("foo");
b.add("bar");
List<String> b = new ArrayList<>(a); // shallow copy 'a'
// the following will all hold
assert a.get(0) == b.get(0);
assert a.get(1) == b.get(1);
assert a.equals(b);
assert a != b; // 'a' is not the same object as 'b'