#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
в общем случае.