Это должно сделать это
replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}
with open('path/to/input/file') as infile, open('path/to/output/file', 'w') as outfile:
for line in infile:
for src, target in replacements.iteritems():
line = line.replace(src, target)
outfile.write(line)
РЕДАКТИРОВАТЬ : Чтобы обратиться к комментарию Eildosa , если вы хотите сделать это без записи в другой файл, то вы ' В конечном итоге вам придется читать весь исходный файл в память:
lines = []
with open('path/to/input/file') as infile:
for line in infile:
for src, target in replacements.iteritems():
line = line.replace(src, target)
lines.append(line)
with open('path/to/input/file', 'w') as outfile:
for line in lines:
outfile.write(line)
Редактировать: Если вы используете Python 3.x, используйте replacements.items()
вместо replacements.iteritems()
Most likely, you have simply forgotten to override equals()
and hashCode()
in your type. equals()
is what contains()
checks for.
From the Javadoc:
Returns
true
if this list contains the specified element. More formally, returnstrue
if and only if this list contains at least one elemente
such that(o==null ? e==null : o.equals(e))
.
Since the default implementation of equals
tests for reference equality, it's not suitable for custom data types like this one.
(And if you didn't override equals
and hashCode
, using your types as keys in a HashMap
would be equally futile.)
Edit: Note that to override, you must provide the exact signature.
class MyDataType {
public boolean equals(MyDataType other) { // WRONG!
...
}
public boolean equals(Object other) { // Right!
...
}
}
This is a very strong argument for using the @Override
annotation; the first example would have failed at compile time if annotated with @Override
.
Я предполагаю, что вместо этого вы написали только "строго типизированный" метод равенства переопределения equals (Object). Другими словами, если у вас есть:
public boolean equals(Foo f)
, вам также понадобится
public boolean equals(Object o)
, чтобы переопределить Object.equals.
Это соответствовало бы «равно работает, но не содержит, потому что ваши тесты, вероятно, вызывают строго типизированный равно, а ArrayList - нет.
Вы переопределили метод equals? Это необходимо для правильной работы содержимого.
может быть, вместо этого использовать класс Integer? тогда вы можете выполнить сравнение объектов
Помните, что если вы не переопределите метод equals (), тогда два объекта вашего типа будут равны, только если они один и тот же экземпляр этого объекта. Класс ArrayList использует этот метод для проверки того, что он содержит данный объект. Кроме того, вам необходимо точно сопоставить подпись, что означает, что она должна принимать в качестве параметра Object, а не Foo.
Кроме того, в контракте с объектом указано, что вы должны переопределять hashCode () всякий раз, когда вы переопределяете equals (). Если вы этого не сделаете, то HashMap или HashSet не идентифицируют ваши два объекта как равные, даже если это делает ArrayList (HashMap проверяет идентичные хэши, а затем вызывает на них equals () для проверки фактического равенства). Таким образом, если ArrayList говорит, что два элемента не равны, то HashMap тоже не будет.