Используйте метод str.strip
, чтобы удалить пробелы из строка.
Если у вас есть несколько последовательностей, и вы хотите сделать что-то с соответствующими элементами каждой последовательности вы можете использовать zip
в агрегат эти элементы вместе. (Примечание zip
возвращает итератор так в примере list
используется, чтобы показать свой результат)
>>> list(zip('0010000110', '1111010111'))
[('0', '1'), ('0', '1'), ('1', '1'), ('0', '1'), ('0', '0'), ('0', '1'), ('0', '0'), ('1', '1'), ('1', '1'), ('0', '1')]
>>>
Если последовательности в контейнере, вам нужно распаковать их для использования с zip
:
>>> a
['0010000110', '1111010111']
>>> list(zip(*a))
[('0', '1'), ('0', '1'), ('1', '1'), ('0', '1'), ('0', '0'), ('0', '1'), ('0', '0'), ('1', '1'), ('1', '1'), ('0', '1')]
>>>
После того, как у вас есть аргументы, все сгруппированные вместе, это легко сделать вещи с ними - вы можете передать их функции или в вашем случае, просто сравните их:
>>> [x == y for x,y in zip(*a)]
[False, False, True, False, True, False, True, True, True, False]
>>>
sum
будет потреблять итератора/итерацию и граф все True
«ы - True
имеет значение одного и False
имеет значение, равное нулю.
>>> sum(x == y for x,y in zip(*a))
5
>>>
Как и в сторону: вы можете присвоить результат zip
к имени и использовать его. Это может сделать вещи проще читать:
>>> my_groups = zip(*a)
>>> my_groups
<zip object at 0x000000000308A9C8>
>>> sum(x == y for x,y in my_groups)
5
>>>
Если у вас есть несколько вещей, и вы хотите, чтобы сравнить друг с другом, itertools
может сделать его легко получить комбинаций/перестановки.
>>> import itertools
>>> data
['0010000110', '1111010111', '0000110111']
>>> for permutation in itertools.permutations(data, 2):
print(permutation)
('0010000110', '1111010111')
('0010000110', '0000110111')
('1111010111', '0010000110')
('1111010111', '0000110111')
('0000110111', '0010000110')
('0000110111', '1111010111')
>>>
Использование zip
, sum
и itertools
вы можете написать что-то, что делает то, что вы хотите
>>> for combination in itertools.combinations_with_replacement(data, 2):
print(combination, sum(x == y for x,y in zip(*combination)))
('0010000110', '0010000110') 10
('0010000110', '1111010111') 5
('0010000110', '0000110111') 6
('1111010111', '1111010111') 10
('1111010111', '0000110111') 5
('0000110111', '0000110111') 10
>>>
>>> for a,b in itertools.combinations_with_replacement(data, 2):
total = sum(x == y for x,y in zip(a, b))
ratio = total/len(a)
print(a, b, total, ratio)
0010000110 0010000110 10 1.0
0010000110 1111010111 5 0.5
0010000110 0000110111 6 0.6
1111010111 1111010111 10 1.0
1111010111 0000110111 5 0.5
0000110111 0000110111 10 1.0
>>>
Мне нравится использовать format strings форматировать мои заявления печати:
>>> s = 'combination: {} {}\ttotal: {}\tratio: {}'
>>> for a,b in itertools.combinations_with_replacement(data, 2):
total = sum(x == y for x,y in zip(a, b))
ratio = total/len(a)
print(s.format(a, b, total, ratio))
combination: 0010000110 0010000110 total: 10 ratio: 1.0
combination: 0010000110 1111010111 total: 5 ratio: 0.5
combination: 0010000110 0000110111 total: 6 ratio: 0.6
combination: 1111010111 1111010111 total: 10 ratio: 1.0
combination: 1111010111 0000110111 total: 5 ratio: 0.5
combination: 0000110111 0000110111 total: 10 ratio: 1.0
>>>
Я использую list comprehensions and generator expressions, которые являются компактным способом написания for
цикла - многие люди предпочитают их, как только они привыкают к ним (до тех пор, пока они не слишком сложны):
>>> data = [1,2,3]
>>> for x in data:
print(x+2)
3
4
5
Это можно записать в сокращенном формате в виде перечня:
>>> [x + 2 for x in data]
[3, 4, 5]
>>>
Ожидаемый результат для вашего образца файла, пожалуйста. – timgeb
Вы можете выполнить итерацию с помощью 'zip (a, b)' и сказать 'для suba, subb в zip (a, b)'. Таким образом, вам не нужно иметь дело с 'a [i]'; вы можете просто использовать 'suba'. Кроме того, вам не нужны точки с запятой в конце ваших строк. В Python символ новой строки или точки с запятой означает следующую команду. Использование обоих является избыточным. – zondo
Как вы закончили с «1» в первом примере? ... вы сказали, что если оба являются «1», то увеличиваются на «1»? .. Не должно быть '0,3'? –