'оперативные' строковые модификации в Python

решение 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, тогда вы создаете дополнительные ненужные столбцы)

20
задан Paul Nathan 12 August 2010 в 00:31
поделиться

13 ответов

Я сделал это как это:

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()
0
ответ дан 29 November 2019 в 22:52
поделиться

Не используйте строку, используйте что-нибудь изменяемое, например 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 напрямую.

17
ответ дан 29 November 2019 в 22:52
поделиться

Python-аналогом вашего C:

for(int i = 0; i < strlen(s); i++)
{
   s[i] = F(s[i]);
}

будет:

s = "".join(F(c) for c in s)

, который также очень выразителен. Он точно говорит о том, что происходит, но в функциональном стиле, а не в процедурном стиле.

17
ответ дан 29 November 2019 в 22:52
поделиться

Строки можно повторять, и их можно просматривать как списки. Строки также имеют ряд основных методов, таких как .replace () , которые могут быть тем, что вы ищете. Все строковые методы возвращают новую строку. Поэтому вместо изменения строки на месте вы можете просто заменить ее существующее значение.

>>> mystring = 'robot drama'
>>> mystring = mystring.replace('r', 'g')
>>> mystring
'gobot dgama'
2
ответ дан 29 November 2019 в 22:52
поделиться

вы можете использовать модуль UserString:

 >>> import UserString
... s = UserString.MutableString('Python')
... print s
Python
>>> s[0] = 'c'
>>> print s
cython
10
ответ дан 29 November 2019 в 22:52
поделиться

Если мне когда-нибудь понадобится сделать что-то подобное, я просто конвертирую его в изменяемый список

Например ... (хотя было бы проще использовать сортировку (см. Второй пример))

>>> s = "abcdfe"
>>> s = list(s)
>>> s[4] = "e"
>>> s[5] = "f"
>>> s = ''.join(s)
>>> print s
abcdef
>>>
# second example
>>> s.sort()
>>> s = ''.join(s)
0
ответ дан 29 November 2019 в 22:52
поделиться

Вы можете использовать класс StringIO для получения файлового изменяемого интерфейса строки.

0
ответ дан 29 November 2019 в 22:52
поделиться

string.translate, вероятно, самая близкая функция к тому, что вам нужно.

3
ответ дан 29 November 2019 в 22:52
поделиться
>>> mystring = "Th1s 1s my str1ng"
>>> mystring.replace("1", "i")
'This is my string'

Если вы хотите сохранить эту новую строку, вам придется mystring = mystring.replace("1", "i"). Это связано с тем, что в Python строки неизменяемы.

1
ответ дан 29 November 2019 в 22:52
поделиться

Я бы сказал, что наиболее питоническим способом является использование map () :

s = map(func, s) # func has been applied to every character in s

Это эквивалент записи:

s = "".join(func(c) for c in s)
7
ответ дан 29 November 2019 в 22:52
поделиться

Присвоение определенного символа определенному индексу в строке не является особенно распространенной операцией, поэтому, если вам нужно это сделать, подумайте, может ли быть лучший способ выполнить задача. Но если вам действительно нужно, вероятно, наиболее стандартным способом было бы преобразовать строку в список, внести изменения, а затем преобразовать ее обратно в строку.

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)
2
ответ дан 29 November 2019 в 22:52
поделиться
def modifyIdx(s, idx, newchar):
    return s[:idx] + newchar + s[idx+1:]
0
ответ дан 29 November 2019 в 22:52
поделиться

Вот пример использования translate для замены "-" на "." и заглавных букв "a"

>>> from string import maketrans
>>> trans_table = maketrans(".-a","-.A")
>>> "foo-bar.".translate(trans_table)
'foo.bAr-'

Это намного эффективнее, чем перелистывание в байтовый массив и обратно, если вам нужно заменить только один символ

1
ответ дан 29 November 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: