#python #list #python-2.7 #dictionary
#python #Список #python-2.7 #словарь
Вопрос:
У меня есть словарь примерно с 2000 значениями с примером данных ниже:
{'chr': [('190', '192'),
('190', '252'),
('190', '255'),
('253', '255'),
('337', '339'),
('337', '2796'),
('337', '2799'),
('2797', '2799'),
('2801', '2803'),
('2801', '3730'),
('2801', '3733'),
('3731', '3733'),
('3734', '3736'),
('3734', '5017'),
('3734', '5020'),
('5018', '5020'),
('5234', '5236'),
('5234', '5527'),
('5234', '5530'),
('5528', '5530')]}
Я отсортировал его по первому значению в каждой записи значения, но что я хочу сделать, это сравнить каждое значение со следующим в списке значений и определить, насколько сильно они пересекаются или разница между ними, и добавить это значение в новый список.
Например, при сравнении (190,192) и (190,252) затем происходит перекрытие 2, так что это будет добавлено в список с именем «Расстояние».
Я пытался разобраться, как это сделать, используя код:
for key, values in Contigs:
for i,next(i) in Contigs:
is = set(i)
nis = set(next(i))
is.intersection(nis)
Это не сработало, но я работал над идеей, что должен быть какой-то способ выбрать как i, так и следующую итерацию i для сравнения, сравнить, а затем перейти к следующей итерации.
У кого-нибудь есть какие-либо подсказки о том, как это сделать?
Спасибо!
Комментарии:
1. какие именно значения вы сравниваете?
2. Можете ли вы еще раз объяснить сравнение?
3. Извините, я хочу сравнить каждую итерацию в списке значений со следующей итерацией.
4. «(190,192) и (190,252) затем перекрываются на 2» — я не понимаю
5. В вашем коде вы не должны указывать
is
в качестве переменной, поскольку это ключевое слово в python.
Ответ №1:
Использовать enumerate:
values=d["chr"]
for i,j in enumerate(values[:-1]):
first,second=set(j),set(values[i 1]) # current value and next
print first.intersection(second)
Если вы хотите сравнить значения последнего значения первого элемента и первого из второго, это сработает, но из вашего опубликованного кода я не уверен, где и как вы вычитаете, чтобы найти разницу:
Distance = []
values=d["chr"]
for i,j in enumerate(values[:-1]):
first,second=int(j[1]),int(values[i 1][0])
diff = first - second # not sure if you want this or not
x = range(first)
y = range(second)
distances = list(set(x) amp; set(y))
Distance.append(distances)
Комментарии:
1. Похоже, это работает, и это здорово, и я попытался связать это с дополнительным кодом, чтобы выполнить сравнение, как показано ниже, но я не уверен, как извлечь числа для использования в диапазоне. У вас есть какие-нибудь идеи по этому поводу? Расстояние = [] значения= Контиги[«chr»] для i, j в enumerate(значения [: -1]): первое, второе= set(j),set(значения[i 1]) x = диапазон (первый) y = диапазон (второй) расстояния = список (set(x) amp; set(y)) Distance.append(расстояния)
2. Я посмотрю, для чего нужны ваши диапазоны? Значит, значения, которые имеют значение, являются последними из первых и первыми из вторых?
Ответ №2:
Вот пример использования pairwise
рецепта
from itertools import izip, tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return izip(a, b)
>>> [int(a[1])-int(b[0]) for a,b in pairwise(i)]
[2, 62, 2, -82, 2, 2459, 2, -2, 2, 929, 2, -1, 2, 1283, 2, -214, 2, 293, 2]