Создайте словарь С позицией символа и его соответствующим количеством

#python #python-3.x #etl

Вопрос:

У меня есть несколько строк, таких как:

 0000NNN
000ANNN
 

Я хочу получить словарь, в котором в качестве ключа указана позиция символа в каждой строке, а в качестве значения-количество соответствующих 0 (если символ НЕ равен 0, его можно игнорировать). Таким образом, для приведенных выше строк вывод будет:

 1:2
2:2
3:2
4:1
5:0
6:0
7:0
 

До сих пор я пробовал это:

 ctr=1
my_dict={}
for word in string_list:
    for letter in word:
        if letter == "0":
            if ctr not in my_dict.keys():
                my_dict[ctr]=1
            else:
                my_dict[ctr] =1
        else:
            pass        
print(my_dict)  
 

Что я делаю не так, так как вывод неверен?

Комментарии:

1. Гарантируется ли, что строки будут одинаковой длины?

2. @Дюрталь Да, всегда одинаковой длины

Ответ №1:

Похоже, вы никогда не увеличиваете и не сбрасываете ctr и не добавляете my_dict[ctr]=0 для 5,6,7. Что — то вроде этого должно сработать:

 string_list = ['0000NNN','000ANNN']

my_dict={}
for word in string_list:
    ctr=1 #Moved
    for letter in word:
        if letter == "0":
            if ctr not in my_dict.keys():
                my_dict[ctr]=1
            else:
                my_dict[ctr] =1
        else:
            my_dict[ctr]=0 #Added
        ctr =1 #Added
print(my_dict)  #{1: 2, 2: 2, 3: 2, 4: 0, 5: 0, 6: 0, 7: 0}
 

Ответ №2:

Вы можете использовать collections.Counter следующим образом:

 >>> Counter(i for string in strings for i, c in enumerate(string, start=1) if c == '0')
Counter({1: 2, 2: 2, 3: 2, 4: 1})
 

Ответ №3:

Вы не увеличиваете ctr, поэтому ctr == 1 всегда. Но одно это не даст вам того, чего вы хотите. Прямо сейчас вы подсчитываете все » 0 «во всех ваших словах и сохраняете их в словарном ключе «1».

Вместо этого вы хотите отслеживать позицию и количество отдельно.

 my_dict = {}
for pos in range(7):  # assuming your "words" are the same length - 7 chars
  my_dict[pos] = 0
  for word in string_list:
    if word[pos] == '0':
      my_dict[pos]  = 1
 

Ответ №4:

Вы могли бы использовать zip() вот так.

 s = ["0000NNN", "000ANNN"]
d = {}
for i,v in enumerate(zip(s[0], s[1]),1):
    d[i] = v.count('0')

print(d)
 
 {1: 2, 2: 2, 3: 2, 4: 1, 5: 0, 6: 0, 7: 0}
 

Ответ №5:

Что-то в следующем роде должно указать вам в правильном направлении:

 strings = ["0000NNN", "000ANNN"]

d = {i 1: sum(s[6-i] != "0" for s in strings) for i in range(7)}
# {1: 2, 2: 2, 3: 2, 4: 1, 5: 0, 6: 0, 7: 0}
 

6 Шестеро были бы length-1 в общем случае.