2014-07-04 5 views
0

У меня есть словарь с примерно 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 для сравнения, сравнить, а затем перейти на следующую итерацию.

У кого-нибудь есть информация о том, как это сделать?

Спасибо!

+1

какие значения вы точно сравниваете? –

+0

Можете ли вы снова объяснить сравнение? –

+0

Извините, я хочу сравнить каждую итерацию в списке значений со следующей итерацией. – Tom

ответ

1

Используйте перечисление:

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) & set(y)) 
    Distance.append(distances) 
+0

. Это, похоже, отлично работает, и я попытался связать его с дополнительным кодом, чтобы выполнить сравнение, как показано ниже, но я не уверен, как извлекать числа для использования в диапазоне , У вас есть идея? Distance = [] values ​​= Contigs ["chr"] для i, j в перечислении (значения [: - 1]): first, second = set (j), set (значения [i + 1]) x = диапазон (первый) y = диапазон (второй) дистанции = список (набор (x) & set (y)) Расстояние.append (distance) – Tom

+0

Я посмотрю, для чего ваши диапазоны? Значит, значения, которые имеют значение, являются последними из первых и первых секунд? –

0

Вот пример использования pairwise recipe

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] 
Смежные вопросы