2014-08-07 2 views
1

У меня есть CSV-файл с одного столбца, который имеет следующие данные в файле test.csvсписок Минимальное видоизменение, делая несколько замен в цикле

3 0JKT02 CX85d 
3 0JNAd0 CP80d 
3 0KAAd0 CT894 
3 0KAAd0 CT895 
3 0LARd0 CL003 
3 0JNA10 CL80d 
3 0JNA20 CL80d 
3 0JNA30 CL80d 
3 0JNA40 CL80d 
3 0FAK3e CL00v 
3 0FAK3e CT00e 

, что я хочу сделать, это заменить всю небольшую крышку (d, e и v) с экземплярами. Здесь

d = [1,2,3,4] 
e = [1,2] 
v = [3,4] 

Так взять пример последних двух пунктов, мне нужно, чтобы получить 3 0FAK31 CL003, 3 0FAK32 CT003, 3 0FAK31 CL004, 3 0FAK32 CT004.

Я объявил массив со всеми старыми значениями в них, я прохожу через этот массив и обновляю его один за другим, потому что он мутирует, я не получаю ожидаемых результатов. Кажется, он пропускает код «удалить» и просто закручивает список. Плюс он все еще имеет переменную e и v в «oldarray». Я расстроен, пожалуйста, помогите. Также, если вы можете критиковать мой код и предлагать больше питонического способа сделать это, я был бы признателен. Вот код ...

class Compare: 
    def __init__(self): 
     f1 = open('test.csv','r') 
     self.oldarray = [] 
     for row1 in f1: 
      self.oldarray.append(row1.strip('\n').strip()) 
     self.dict1 = {'d':[1,2,3,4],'e':['1','2'], 'v':['3','4']} 

    def work(self,key,values): 
     for item in self.oldarray: 
      if key in item: 
       for each in values: 
        self.oldarray.append(item.replace(key,each)) 
       self.oldarray.remove(item)   

    def do(self): 
     for key,values in self.dict1.items(): 
      self.work(key,values) 

if __name__ == '__main__': 
    import csv 
    x = Compare() 
    x.do() 
    for i in x.oldarray: 
     print i 
+5

Нечетный дизайн. Для этого используйте простые функции и переменные. –

+0

Да, мне не нужен дизайн ООП, но я пытаюсь это узнать. Обычно я бы выполнял только функции. – LuckyStarr

+1

Используйте OOP, когда вам это нужно, не используйте его везде. Если вы узнаете, то это довольно плохой пример. – simonzack

ответ

0

Рассмотрите возможность использования генератора Вместо мутирует список во время прохода над ним, вещим подходом должны написать функцию, которая принимает в одной последовательности и дает другую последовательность. Вы можете взять последовательность строк, а затем дать одну линию или более строк для каждой строки ввода на основе ваших замещений. Это займет только одна функция, а не класс.

Ваши «дополнительные» переменные остаются, потому что вы делаете только один replace() за раз. Похоже, вы хотите переместить комбинации доступных букв для замены, поэтому, если присутствуют как e, так и v, вы должны получить 4 строки вывода. Вот пример того, как вы могли бы использовать itertools.product для решения этой проблемы, так как я не думаю, что вы так же легко сможете добраться с помощью циклов.

import itertools 
mapping = {'d':[1,2,3,4],'e':['1','2'], 'v':['3','4']} 
line = "3 0FAK3e CL00v" 
subs = (
    [(key, value) for value in mapping[key]] 
    for key in mapping 
    if key in line 
    ) 
for combination in itertools.product(*subs): 
    lineb = line 
    for letter, number in combination: 
     lineb = lineb.replace(str(letter), str(number)) 
    print lineb 

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

+0

Спасибо, куча, это работает! Тем не менее, я знаю, что мой подход не был Pythonic, но я удивлен, почему он не работает !!! Каждый новый элемент, который я добавляю в append, добавляется в конце, так почему он не работает? Это просто ужаснуло меня, что это не работает, несмотря на то, что моя логика правильная. В любом случае, вы можете настроить мой подход и заставить его работать? Я не подвешиваю подход ООП, но по логике. – LuckyStarr

+0

Попробуйте написать простой цикл над списком, который удаляет текущий элемент, а затем печатает список. Каждый раз, когда вы удаляете элемент, другие предметы «сдвигаются» так, чтобы ваша петля заканчивала пропуски предметов. Вот почему не рекомендуется удалять элементы из списка, который вы повторяете. Или, если вам нужно, обведите назад. –