dplyr
с использованием mutate_each
и труб говорит, что у вас есть следующее:
> dft
Source: local data frame [11 x 5]
Bureau.Name Account.Code X2014 X2015 X2016
1 Senate 110 158,000 211,000 186,000
2 Senate 115 0 0 0
3 Senate 123 15,000 71,000 21,000
4 Senate 126 6,000 14,000 8,000
5 Senate 127 110,000 234,000 134,000
6 Senate 128 120,000 159,000 134,000
7 Senate 129 0 0 0
8 Senate 130 368,000 465,000 441,000
9 Senate 132 0 0 0
10 Senate 140 0 0 0
11 Senate 140 0 0 0
и хотите удалить запятые из переменных года X2014-X2016, и преобразовать их в числовые. также, скажем, X2014-X2016 читаются как факторы (по умолчанию)
dft %>%
mutate_each(funs(as.character(.)), X2014:X2016) %>%
mutate_each(funs(gsub(",", "", .)), X2014:X2016) %>%
mutate_each(funs(as.numeric(.)), X2014:X2016)
mutate_each
применяет функцию (ы) внутри funs
к указанным столбцам
I последовательно выполнял одну функцию за раз (если вы используете несколько функций внутри funs
, тогда вы создаете дополнительные ненужные столбцы)
Я сделал это как это:
import tempfile
import shutil
...
f_old = open(input_file, 'r')
with tempfile.NamedTemporaryFile() as tmp:
for line in f_old:
tmp.write(line.replace(old_string, new_string))
f_old.close()
tmp.flush()
os.fsync(tmp)
shutil.copy2(tmp.name, input_file)
tmp.close()
Не используйте строку, используйте что-нибудь изменяемое, например bytearray:
#!/usr/bin/python
s = bytearray("my dog has fleas")
for n in xrange(len(s)):
s[n] = chr(s[n]).upper()
print s
Результат:
MY DOG HAS FLEAS
Edit:
Поскольку это bytearray
, вы не (обязательно) работают с символами . Вы работаете с байтами . Так что это тоже работает:
s = bytearray("\x81\x82\x83")
for n in xrange(len(s)):
s[n] = s[n] + 1
print repr(s)
дает:
bytearray(b'\x82\x83\x84')
Если вы хотите изменить символы в строке Unicode, вы, возможно, захотите работать с memoryview
, хотя он не поддерживает Unicode напрямую.
Python-аналогом вашего C:
for(int i = 0; i < strlen(s); i++)
{
s[i] = F(s[i]);
}
будет:
s = "".join(F(c) for c in s)
, который также очень выразителен. Он точно говорит о том, что происходит, но в функциональном стиле, а не в процедурном стиле.
Строки можно повторять, и их можно просматривать как списки. Строки также имеют ряд основных методов, таких как .replace ()
, которые могут быть тем, что вы ищете. Все строковые методы возвращают новую строку. Поэтому вместо изменения строки на месте вы можете просто заменить ее существующее значение.
>>> mystring = 'robot drama'
>>> mystring = mystring.replace('r', 'g')
>>> mystring
'gobot dgama'
вы можете использовать модуль UserString:
>>> import UserString
... s = UserString.MutableString('Python')
... print s
Python
>>> s[0] = 'c'
>>> print s
cython
Если мне когда-нибудь понадобится сделать что-то подобное, я просто конвертирую его в изменяемый список
Например ... (хотя было бы проще использовать сортировку (см. Второй пример))
>>> s = "abcdfe"
>>> s = list(s)
>>> s[4] = "e"
>>> s[5] = "f"
>>> s = ''.join(s)
>>> print s
abcdef
>>>
# second example
>>> s.sort()
>>> s = ''.join(s)
Вы можете использовать класс StringIO для получения файлового изменяемого интерфейса строки.
string.translate
, вероятно, самая близкая функция к тому, что вам нужно.
>>> mystring = "Th1s 1s my str1ng"
>>> mystring.replace("1", "i")
'This is my string'
Если вы хотите сохранить эту новую строку, вам придется mystring = mystring.replace("1", "i")
. Это связано с тем, что в Python строки неизменяемы.
Я бы сказал, что наиболее питоническим способом является использование map ()
:
s = map(func, s) # func has been applied to every character in s
Это эквивалент записи:
s = "".join(func(c) for c in s)
Присвоение определенного символа определенному индексу в строке не является особенно распространенной операцией, поэтому, если вам нужно это сделать, подумайте, может ли быть лучший способ выполнить задача. Но если вам действительно нужно, вероятно, наиболее стандартным способом было бы преобразовать строку в список, внести изменения, а затем преобразовать ее обратно в строку.
s = 'abcdefgh'
l = list(s)
l[3] = 'r'
s2 = ''.join(l)
РЕДАКТИРОВАТЬ: Как указано в ответе bstpierre, bytearray
, вероятно, даже лучше для этой задачи, чем list
, если вы не работаете со строками Unicode.
s = 'abcdefgh'
b = bytearray(s)
b[3] = 'r'
s2 = str(b)
def modifyIdx(s, idx, newchar):
return s[:idx] + newchar + s[idx+1:]
Вот пример использования translate для замены "-" на "." и заглавных букв "a"
>>> from string import maketrans
>>> trans_table = maketrans(".-a","-.A")
>>> "foo-bar.".translate(trans_table)
'foo.bAr-'
Это намного эффективнее, чем перелистывание в байтовый массив и обратно, если вам нужно заменить только один символ