2015-08-14 3 views
0

Я использую Dictionary как способ преобразования ключей в значения для дальнейшего использования (здесь с Pandas).Приоритет при замене строк

abc = {"ABC":"ALPHABET"} 
a = {"A":"APPLE"} 

words = abc.copy() 
words.update(a) 

for w in words: 
    df.loc[df["company"].str.contains(w), "company"] = words[w] 

Давайте использовать пример строки: "Company ABC" в колонке "company".

Моя проблема заключается в том, что, когда строка должна давать соответствие "ABC":"ALPHABET", dict дает приоритет "A":"APPLE". Это похоже на случай, независимо от порядка в dict.

Могу ли я сделать программу разграничивать, когда применять "A:APPLE", например, сделав regex правило, "A" должен быть в конце строки, как: "Company A"?

+0

«диктат дает преимущество», это не вещь, что вы имеете в виду? «порядок в« dict »- это тоже не вещь, словари не имеют порядка. Вы можете сортировать ключи с помощью 'sorted (words.keys())'. –

+0

@machineyearning AFAIK, в словарях есть случайный порядок, но они не «упорядочены». То, что я имею в виду, отдавая предпочтение, - это то, что я написал на простом английском. – Winterflags

+0

Если вам нужен только порядок, в python2.7 вы можете использовать OrderedDict из библиотеки коллекций (https://docs.python.org/2/library/collections.html#collections.OrderedDict) – tmrlvi

ответ

2

Насколько я понимаю, вы хотите заменить строку другими строками в соответствии с прецедентами. Здесь есть две проблемы:

  1. Использование структуры данных, которая сохраняет заказ, поэтому регулярный словарь на языке питонов не подходит для этой цели. (Вы можете использовать collections.OrderedDict, чтобы обойти это).
  2. Изменение данных во время итерации. В исходном коде вы изменили данные в середине, что бы вызвало второе слово, которое будет проверено на первом слове.

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

words = [("ABC", "ALPHABET"), 
     ("A", "APPLE")] 

word_series = [] 

for word, replace in words: 
    series = df["company"].str.contains(word) 
    word_series.append((series, replace)) 

for series, replace in reversed(word_series): 
    df.loc[series, "company"] = replace 
+1

'для серий, замените в word_series:', ваша переменная 'list'' word_series' будет пустой здесь. Я предполагаю, что вы имеете в виду 'word_series.insert' выше. Кроме того, если вы хотите перебрать ваши значения в обратном порядке, вам не нужно вставлять их в начало списка с помощью 'insert (0', вы можете использовать встроенную функцию' reverseed' так: ' для серий, замените в обратном (word_series) ' –

+1

Вы правы. Спасибо. Исправлено. Об обратном - я думаю, что примерно то же самое относительно времени работы, нет? (Поскольку список предметов будет очень мал) – tmrlvi

+0

I не думайте так, так как «обратный» просто дает вам итератор назад по элементам, который должен быть постоянным временем O (1), омраченным стоимостью «append» и «traversing». С другой стороны, 'insert' это O (n), что означает, что вы получите O (n^2), вставляя n элементов. См.: https://wiki.python.org/moin/TimeComplexity –

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