Извлечь список значений из словаря для сравнения?

#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]