Вычислите наибольшее расстояние между любыми двумя строками в группе, используя Python

Мой вопрос заключается в том, как рассчитать наибольшее расстояние между любыми двумя строками, соответствующими определенной группе. Каждая строка в моем файле начинается с «номера группы», за которым следует длинная строка. Я хочу знать для каждой группы, какое наибольшее расстояние между любыми двумя строками в группе для каждой группы. Ниже приведен файл, с которым я работаю (строки были сокращены). Обратите внимание, что группы не обязательно расположены по порядку, и с некоторыми из моих групп связана только одна строка, поэтому я хотел бы просто пропустить их (группа «3» в приведенном ниже примере):

 0 GCAGACGGGUGAGUAACGCGUGGGAACGUACCAUUUGCUACGGAAUAACUCAGG
 0 GCAGACGGGUGAGUAACGCGUGGGAACGUACCAUUUGCUACGGAAUAACUCAGG
 1 CGAACGGGUGAGUAACACGUGGGCAAUCUGCCCUGCACUCUGGGACAAGCCCUG
 1 CGAACGGGUGAGUAACACGUGGGCAAUCUGCCCUGCACUCUGGGACAAGCCCUG
 1 CGAACGGGUGAGUAACACGUGGGCAAUCUGCCCUGCACUCUGGGACAAGCCCUG
 2 GCCCUUCGGGGUACUCGAGUGGCGAACGGGUGAGUAACACGUGGGUGAUCUGCC
 2 GCCCUUCGGGGUACUCGAGUGGCGAACGGGUGAGUAACACGUGGGUGAUCUGCC
 2 GCCCUUCGGGGUACUCGAGUGGCGAACGGGUGAGUAACACGUGGGUGAUCUGCC
 0 GCAGACGGGUGAGUAACGCGUGGGAACGUACCAUUUGCUACGGAAUAACUCAGG
 0 GCAGACGGGUGAGUAACGCGUGGGAACGUACCAUUUGCUACGGAAUAACUCAGG
 3 GCAGACGGGUGAGUAACAAAAAGGAACGUACCAUUUGCUACGGAAUAACUCAGG

Я хочу создать что-то, что создаст вывод, который будет выглядеть примерно так:

 Group0 = 0
 Group1 = 1.2
 Group2 = 2.1

 Average = 1.1

Этот вывод даст мне номер группы, а затем наибольшую разницу для этой группы. А также общее среднее значение наибольшей разницы между всеми группами (снова пропуская группы, с которыми связана только одна строка):

В моем реальном файле около 5000 групп, а строки, которые я сравниваю, имеют длину ~ 400 символов.

Я думаю, что мог бы начать решать это, посмотрев на этот вопрос , но я не знаю, как рассчитать процентные различия только для строк в одной группе, избежать групп только с одной строкой и вычислить общую среднюю процентную разницу для всех групп. Любая помощь будет принята с благодарностью, большое спасибо за любые идеи!

РЕДАКТИРОВАТЬ: Вот несколько усеченных строк из файла, с которым я работаю. Числа «группы» находятся в диапазоне от 0 до ~ 6000. Строка букв на самом деле имеет длину 426 символов. Формат файла: [число][пробел][строка букв][символ конца строки].

7 UGGCGAACGGGUGAGUAAC
35 GUGGGGAUUAGUGGCGAAC
50 AAACGAGAUGUAGCAAUAC
82 GGAGAGAGCUUGCUCUCUU
479 UCAGGAGCUUGCUCCUGU
46 CGAGGAGCUUGCUCCUUU
24 AACUGGGUCUAAUACCUU


person Jen    schedule 18.01.2014    source источник
comment
Я не думаю, что вы вообще спрашиваете о вычислении разницы между строками - вы знаете, как это сделать, из опубликованного вами вопроса. Вы задаете более простой вопрос о том, как обработать список строк из файла, верно?   -  person GreenAsJade    schedule 19.01.2014
comment
Используйте расстояние Левенштейна между двумя строками и присвойте вес каждой операции модификации 1. Вы получите некоторую меру того, сколько символов необходимо отредактировать, чтобы две строки были равны. Затем вы можете взять его как% от длины вашей строки.   -  person yǝsʞǝla    schedule 19.01.2014
comment
да, вы, вероятно, хотите расстояние Левенстина ... это стандартная мера того, насколько далеко друг от друга находятся две строки ... pct = levenstein_dist/word_length   -  person Joran Beasley    schedule 19.01.2014
comment
Могу ли я использовать levenstein_dist для более чем 2 строк? Я думал, что это работает только при сравнении 2   -  person Jen    schedule 19.01.2014
comment
Ах, так что на один из ваших вопросов задан набор строк, что вообще означает вопрос «Какова процентная разница между всеми этими строками?»? ... Правильно? Можете ли вы сами ответить на этот вопрос: я думаю, это зависит от проблемы, которую вы решаете. Я не могу понять, что вы имеете в виду под процентной разницей между этими тремя строками?   -  person GreenAsJade    schedule 19.01.2014
comment
@GreenAsJade Да! Итак, если в группе Group0 четыре строки, какова процентная разница между этими четырьмя строками? А затем продолжите для каждой группы, по крайней мере, с двумя строками для сравнения.   -  person Jen    schedule 19.01.2014
comment
Вот почему я подумал, что в другом вопросе есть некоторые элементы, которые могут быть полезны, но он работает только при просмотре двух строк.   -  person Jen    schedule 19.01.2014
comment
Только вы можете ответить на вопрос, какова процентная разница между 4 вещами?, исходя из того, что ваша ситуация говорит о том, что это означает. Разница по своей сути является двухпараметрической мерой. Что вы пытаетесь измерить? Например, можете ли вы сказать мне, какова процентная разница между 10, 12, 13 и 18?   -  person GreenAsJade    schedule 19.01.2014
comment
@GreenAsJade Я знаю, что каждая строка (независимо от группы) имеет длину 400 символов, поэтому я хотел бы выяснить, насколько строки в группе похожи друг на друга. Возможно, для большинства групп все строки идентичны! Или, возможно, они очень близки (отличаются друг от друга всего на 5 символов из 400!). Это то, к чему я клоню, это имеет больше смысла? Я думал, что процентная разница будет лучшим способом сделать это.   -  person Jen    schedule 19.01.2014
comment
Итак, считаете ли вы полезным знать, какое наибольшее расстояние между любыми двумя строками в этой группе? Может быть, это то, что вы спрашиваете?   -  person GreenAsJade    schedule 19.01.2014
comment
@GreenAsJade О, мне это нравится, это хороший способ сформулировать это. Я собираюсь отредактировать вопрос!   -  person Jen    schedule 19.01.2014
comment
давайте продолжим это обсуждение в чате   -  person GreenAsJade    schedule 19.01.2014
comment
Я перефразировал вопрос, надеюсь, это сделает то, о чем я прошу, более понятным. Спасибо за комментарии/помощь!   -  person Jen    schedule 19.01.2014
comment
Если ваши группы становятся большими, вы можете оценить деревья BK: blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Tree   -  person dstromberg    schedule 19.01.2014
comment
На самом деле правильный способ решить эту проблему — взять микроскоп и нанять студента-старшекурсника, чтобы тот сравнил каждое из оснований в некоторых цепочках РНК.   -  person Cody Piersall    schedule 19.01.2014
comment
@CodyPiersall, ха-ха, ну, я студент, так что, может быть, я на правильном пути? :П   -  person Jen    schedule 21.01.2014


Ответы (3)


Вы также можете попробовать использовать SequenceMatcher difflib из стандартной библиотеки:

>>> import difflib
>>> from itertools import groupby, combinations

>>> def find_max_ratio(lines):
    lines = [row.split() for row in lines]  # the file should already break at each line break
    lines = [(int(row[0]), row[1]) for row in lines]
    lines = groupby(sorted(lines), lambda x: x[0])  # combine strings into their respective groups, sorting them first on int of first element
    group_max = dict()
    for group in lines:
        strings = list(group[1])  # need to convert group[1] from iterator into list
        if len(strings) > 1:  # if the number of strings is 1, then there is nothing to compare the string with in its group
            similarity = 1
            for line1, line2 in combinations(strings, 2):
                s = difflib.SequenceMatcher(None, line1[1], line2[1])  # need to compare second element in each list and exclude the first element (which is the group number)
                similarity = s.ratio() if s.ratio() < similarity else similarity
            group_max[line1[0]] = 1 - similarity  # gives difference ratio
    return group_max

>>> t = open('test.txt')
>>> print find_max_ratio(t)  # it appears that your examples don't have any differences
{'1': 0, '0': 0, '2': 0}

Затем вы можете рассчитать среднее значение следующим образом:

>>> max_ratios = find_max_ratio(t)
>>> average = sum(max_ratios.values())/float(len(max_ratios))
>>> average
0.0  # there are no differences in your test data above

EDIT: запись в файл

>>> output = sorted(max_ratios.items(), key=lambda x: x[1], reverse=True)  # sorting by descending ratios
>>> with open('test2.txt', 'w') as f:  # a new file name
>>>     f.write('\n'.join([group + ': ' + str(ratio) for group, ratio in output])
                + '\n\nAverage: ' + str(average))

РЕДАКТИРОВАНИЕ 2: Добавление минимальной разницы

Вы можете добавить минимальную разницу в свой результат (здесь в виде кортежа (<max_difference>, <min_difference>) вот так:

def find_maxmin_ratios(lines):
    lines = [row.split() for row in lines]  # the file should already break at each line break
    lines = [(int(row[0]), row[1]) for row in lines]
    lines = groupby(sorted(lines), lambda x: x[0])  # combine strings into their respective groups, sorting them first on int of first element
    group_minmax = dict()
    for index, group in lines:
        strings = list(group)  # need to convert group[1] from iterator into list
        if len(strings) > 1:  # if the number of strings is 1, then there is nothing to compare the string with in its group
            max_similarity = 1
            min_similarity = 0
            for line1, line2 in combinations(strings, 2):
                s = difflib.SequenceMatcher(None, line1[1], line2[1])  # need to compare second element in each list and exclude the first element (which is the group number)
                max_similarity = s.ratio() if s.ratio() < max_similarity else max_similarity
                min_similarity = s.ratio() if s.ratio() > min_similarity else min_similarity
            group_minmax[index] = (1 - max_similarity, 1 - min_similarity)  # gives max difference ratio and then min difference ratio
    return group_minmax

Затем вы можете найти соответствующие средние значения следующим образом:

>>> t = open('test.txt')
>>> maxmin_ratios = find_maxmin_ratios(t)
>>> maxmin_ratios
{'1': (0, 0.0), '0': (0, 0.0), '2': (0, 0.0)}  # again, no differences in your test data
>>> average_max = sum([maxmin[0] for maxmin in maxmin_ratios.values()])/float(len(maxmin_ratios))
>>> average_min = sum([maxmin[1] for maxmin in maxmin_ratios.values()])/float(len(maxmin_ratios))
>>> average_max, average_min
(0.0, 0.0)  # no differences in your test data

Правка 3. Проблемы с оптимизацией

Наконец, в свете вашего последнего комментария, я не уверен, что вы сможете слишком оптимизировать эту функцию в ее нынешнем виде. Если ваш компьютер не может с этим справиться, вам может потребоваться обработать небольшие фрагменты текста, а затем скомпилировать результаты в конце. difflib не требует огромных объемов памяти, но делает МНОГО работы. Ваша производительность ДОЛЖНА быть намного лучше моей (в зависимости от вашей машины), потому что каждая моя строка была случайной. Если ваши линии больше похожи, чем различны, вы должны сделать намного лучше. Вот результаты cProfile на моей машине для следующего сценария (всего 3,172 часа):

text2.txt
- 9700 lines of text
- each line begins with one random number (1 to 10)
- each line has 400 random characters that follow the random number  # if your data is not random, you should do CONSIDERABLY better than this

Обратите внимание, что большая часть cumtime (общее время для данной функции и всех функций ниже нее) было потрачено в difflib, что вне вашего контроля с текущей функцией. На самом деле остальная часть функции занимает совсем немного времени.

4581938093 function calls in 11422.852 seconds

   Ordered by: tottime  # the total time spent in a given function, excluding time spent in subfunctions

ncalls  tottime percall cumtime percall filename:lineno(function)
81770876    8579.568    0   9919.636    0   difflib.py:350(find_longest_match)
-724102230  1268.238    0   1268.238    0   {method 'get' of 'dict' objects}
4700900 874.878 0   1143.419    0   difflib.py:306(__chain_b)
9401960 160.366 0   10183.511   0.001   difflib.py:460(get_matching_blocks)
2060343126  141.242 0   141.242 0   {method 'append' of 'list' objects}
1889761800  110.013 0   110.013 0   {method 'setdefault' of 'dict' objects}
81770876    32.433  0   55.41   0   <string>:8(__new__)
130877001   32.061  0   32.061  0   {built-in method  __new__ of type object at 0x1E228030}
81770876    29.773  0   29.773  0   {method 'pop' of 'list' objects}
1   23.259  23.259  11422.852   11422.852   <pyshell#50>:1(find_maxmin_ratios)
49106125    21.45   0   33.218  0   <string>:12(_make)
9401960 20.539  0   10239.234   0.001   difflib.py:636(ratio)
335752019   17.719  0   17.719  0   {len}
9401960 17.607  0   30.829  0   {_functools.reduce}
4700900 16.778  0   49.996  0   {map}
230344786   16.42   0   16.42   0   {method  __contains__' of 'set' objects}
191093877   14.962  0   14.962  0   {method 'add' of 'set' objects}
98214517    13.222  0   13.222  0   difflib.py:658(<lambda>)
4700900 6.428   0   6.428   0   {method 'sort' of 'list' objects}
4700900 5.794   0   5.794   0   {method 'items' of 'dict' objects}
4700900 5.339   0   1148.758    0   difflib.py:261(set_seq2)
4700900 4.333   0   1160.351    0   difflib.py:154(__init__)
4700900 3.83    0   1156.018    0   difflib.py:223(set_seqs)
4700900 3.43    0   3.43    0   difflib.py:235(set_seq1)
9401960 3.162   0   3.162   0   difflib.py:41(_calculate_ratio)
9700    0.003   0   0.003   0   {method 'strip' of 'str' objects}
1   0.003   0.003   0.003   0.003   {sorted}
9700    0.001   0   0.001   0   <pyshell#50>:3(<lambda>)
1   0   0   11422.852   11422.852   <string>:1(<module>)
1   0   0   0   0   {method 'disable' of '_lsprof.Profiler' objects}

Если ваша машина может с этим справиться, я бы просто запустил эту функцию и был бы готов ждать два или три часа. Здесь происходит МНОГО всего, чтобы сравнивать эти строки посимвольно.

person Community    schedule 19.01.2014
comment
Спасибо за это! Извините, если это глупый вопрос, но в последней строке, где написано print find_max_ratio(t), нужно ли мне установить t равным файлу, с которым я работаю? - person Jen; 19.01.2014
comment
@Jen Я немного обновил функцию выше (для работы с открытым файлом). Я также открыл файл t (open('test.txt').readlines()) перед вызовом функции с t в качестве аргумента. - person Justin O Barber; 19.01.2014
comment
Спасибо! Когда я набираю строку t = open('test.txt', 'w').readlines() (не волнуйтесь, я не забыл изменить имя файла, ха-ха!) Я получаю эту ошибку: Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: File not open for reading - person Jen; 19.01.2014
comment
ЭТО СРАБОТАЛО! СПАСИБО :D - person Jen; 19.01.2014
comment
Извините, что снова беспокою вас, но как я могу отправить этот вывод в новый текстовый файл? Это возможно? - person Jen; 19.01.2014
comment
Большое спасибо, сработало как шарм! У меня есть последний вопрос, и если это должен быть новый вопрос, я отправлю его (и извините!), но если бы я хотел изменить функцию find_max_ratio(lines), чтобы она могла найти минимальный рацион (тогда я мог бы иметь диапазон для каждой из моих групп), нужно ли мне работать над этими двумя строками? similarity = s.ratio() if s.ratio() < similarity else similarity и group_max[line1[0]] = 1 - similarity - person Jen; 21.01.2014
comment
Я перешел к средней части, но когда я просто набираю эту строку print find_max_ratio(t), все коэффициенты выводятся как 0,5 '1866': 0.5, '4024': 0.5, '4025': 0.5, etc., вы знаете, что это может происходить? - person Jen; 22.01.2014
comment
Это здорово, спасибо! Входные данные имеют форму 0 GCAGACGGGUGAGUAACGCGUGGGAACGUACC (хотя строка букв имеет длину около 400). Кроме того, номер группы может снова появиться позже в файле (то есть 3 строки с нулевой группой в начале, но позже о ее нулевой группе). Это повлияет на что-нибудь? Спасибо, что проверили это снова! - person Jen; 22.01.2014
comment
@Jen Я заметил, что перед некоторыми вашими строками есть пробел, поэтому я добавил .strip(). Кроме того, формат, который вы упомянули, не должен ни на что влиять. Дайте мне знать, если у вас возникнут дополнительные проблемы. - person Justin O Barber; 22.01.2014
comment
Вау, еще раз спасибо! Я протестировал их на небольших образцах файла, с которым я хочу работать (около 10 строк), и они работают отлично! У меня есть еще два вопроса к вам, если вы не против: 1. Как я могу найти среднее значение минимальной разницы, я попытался сделать его для новой функции find_maxmin_ratio на основе того, что вы сделали: >>> min_ratios = find_maxmin_ratios(t) >>> average = sum(find_maxmin_ratios.values())/float(len(find_maxmin_ratios)), но мне не повезло! - person Jen; 22.01.2014
comment
и простите последний вопрос! 2. Когда я использую эти УДИВИТЕЛЬНЫЕ функции :D для всего моего файла, Python, кажется, зависает (белый квадрат смерти!) Я думаю, это потому, что файл имеет длину 9700 строк (вероятно, слишком длинный) - так что я должен разрезать файл на более мелкие части, а затем использовать функции на них, будет ли это моим лучшим выбором? - person Jen; 22.01.2014
comment
@Jen Я обновил Edit 2, чтобы указать, как получить максимальное и минимальное среднее значение. Я тестирую функцию на указанном вами размере файла, но это может занять некоторое время. Я опубликую оптимизацию после завершения теста. - person Justin O Barber; 22.01.2014
comment
@Jen Я добавил третье редактирование. Если ваша машина вообще может с этим справиться, я бы запустил функцию сразу. Функция не потребует много памяти, но, вероятно, займет целиком один процессор вашего компьютера на час-два, а то и больше. См. выше. difflib — наиболее требовательный аспект этой функции. - person Justin O Barber; 23.01.2014
comment
Это действительно интересно, спасибо, что провели меня через оптимизацию! Похоже, моему компьютеру требуется около 2,5 часов, чтобы сделать это. Произошла одна странная вещь: когда я просто поставил maxmin_ratios, я получил вывод только для групп с 1 по 8, хотя я знаю, что есть другие группы (19, 300, 4567), которые имеют более одной строки и должны быть включены в вывод . - person Jen; 24.01.2014
comment
извините, я получаю вывод для групп от 0 до 9. Это похоже на то, что он группирует все группы вместе на основе первого числа, которое он видит (так что 9, 90, 91 и т. д. все будут в одной группе). Я добавляю усеченную версию нескольких строк прямо сейчас! Спасибо, что посмотрели это снова! - person Jen; 24.01.2014
comment
Спасибо, что посмотрели еще раз! Теперь он работает быстрее, но я получаю либо 0, либо 0,5 за все ('3111': (0, 0.0), '1472': (0.5, 0.5), '1470': (0.5, 0.5)). Мне это кажется странным, я скопировал несколько строк своего файла в TextWrangler, чтобы посмотреть на любые невидимые символы, которые могут появляться, но я ничего не вижу. У вас есть идеи, почему он может вычислять только 0 или 0,5? Я действительно не могу отблагодарить вас за то, что вы так обнажились при встрече! - person Jen; 25.01.2014
comment
@Jen Я обновил функцию, и она работает нормально. Я сделал два изменения: (1) Самое главное, я изменил s = difflib.SequenceMatcher(None, line1, line2) на s = difflib.SequenceMatcher(None, line1[1], line2[1]). Вы всегда получали 0,5, потому что SequenceMatcher сравнивал списки [group, sequence], а не только последовательность. Таким образом, группа всегда совпадала при сравнении, а строка никогда не совпадала (при сравнении в целом). (2) Я изменил группу на int. Если вы хотите придерживаться строк, просто удалите эту строку: lines = [(int(row[0]), row[1]) for row in lines]. - person Justin O Barber; 25.01.2014
comment
Он отлично работает и делает именно то, на что я рассчитывал! Если бы был способ поставить вам 10 галочек, я бы поставил (если есть, скажите мне), большое спасибо :) - person Jen; 27.01.2014
comment
@Jen, я рад, что это работает для тебя! Желаем удачи в учебе. - person Justin O Barber; 27.01.2014

seq_file = open("sequences.txt", 'r')

# make an dict of groups, each group is a list of sequences in that group

groups = {}

for item in seq_file.readlines():
    (group, sequence) = item.split()
    try:
        groups[group].append(sequence)
    except:
        groups[group] = [sequence]

# measure the distance from every seq in a group to every other seq in that group,
# keep a record of the maximum found in each group.  (It doesn't matter that we 
# compare a sequence to itself during this process).

max_distances = {}
for group_num, group_seqs in groups.iteritems():
    greatest_distance = 0
    for seq in group_seqs:
        for other_seq in group_seqs:
            greatest_distance = max(greatest_distance, levenshtein_distance(seq, other_seq))

    max_distances[group_num] = greatest_distance          
    print "max for group %s is %s" % (group_num, greatest_distance)

# Average maximum distance, across the groups

max_distanace_list = max_distances.values()
av_max_dist = float(sum(max_distanace_list)/len(max_distanace_list))

... предоставленная вами ссылка показывает, как сделать levenshtein_distance().

person GreenAsJade    schedule 18.01.2014
comment
Спасибо за публикацию ответа, я получил эту ошибку: Traceback (most recent call last): File "help.py", line 15, in <module> groups[group] = [] TypeError: list indices must be integers, not str - person Jen; 19.01.2014
comment
Буду ли я копировать код из другого вопроса для выполнения levenshtein_distance()? (извините, если это глупый вопрос, я новичок в python, поэтому я все еще учусь извлекать то, что мне нужно, из других вопросов): P - person Jen; 19.01.2014
comment
Ах, мое упущение, вам нужно преобразовать группу из строки 1 в целое число 1. Я отредактировал это в... - person GreenAsJade; 19.01.2014
comment
Да, не глядя слишком внимательно, кажется, что вы можете скопировать определение levenshtein_distance непосредственно из этого ответа. Вам нужно поместить его в свой файл перед тем, что я вам показал (чтобы функция была определена до ее использования). Не копируйте дальше конца определения этой функции :) - person GreenAsJade; 19.01.2014
comment
Это исправило это, спасибо за вашу помощь! Я получил еще одну ошибку с этой строкой, и я попытался исправить ее с помощью float, но это не сработало, как вы думаете? group = int(float(group)) ValueError: could not convert string to float: AM158981 - person Jen; 19.01.2014
comment
Какую ошибку вы получили от group=int(group) ? Если группа правильно отделяется от элемента, int(group) должен работать. - person GreenAsJade; 19.01.2014
comment
ой извините, вот! group = int(group) ValueError: invalid literal for int() with base 10: 'AM158981' - person Jen; 19.01.2014
comment
давайте продолжим это обсуждение в чате - person GreenAsJade; 19.01.2014

Вы можете рассчитать процентную разницу между двумя строками следующим образом:

a="GCAUGC"
b="GCAACC"

differences=0

for i in xrange(len(a)):
    if a[i]!=b[i]:
         differences+=1

percentageDifference = 100 * float(difference)/len(a)

Это предполагает, что длины строк одинаковы, как и в вашем примере.

Теперь это зависит от того, что вы действительно подразумеваете под процентной разницей между всеми строками в группе, что вы хотите сделать. Например, вы можете иметь в виду, что хотите проверить разницу между каждой комбинацией двух строк в группе и получить среднее значение.

Проблема выполнения этого только для каждой группы может быть решена путем предварительной обработки данных. Если данные такие, как вы их показываете, вы можете разделить каждую строку в пространстве и использовать номер группы в качестве ключа в словаре и добавить строку в список, который является элементом. Что-то типа:

groupDictionary = {}

groupStringPair = line.split()
group = groupStringPair[0]
stringToAdd = groupStringPair[1]

try:
    groupDictionary[group].append(stringToAdd)
except KeyError:
    groupDictionary[group] = [stringToAdd]

Тогда у вас будет словарь с ключами для каждой группы и список строк для каждой группы в качестве элементов. Если вы хотите игнорировать группы, содержащие только одну строку, вы можете либо удалить их из словаря, либо игнорировать. Вы можете сделать это:

for k, v in groupDictionary.items():
    if len(v)==1:
        del groupDictionary[v]
person Andrew Robinson    schedule 18.01.2014
comment
По-видимому, я пока не могу комментировать другие сообщения, но, похоже, вы хотели бы рассчитать несколько различных показателей средней разницы, чтобы лучше понять данные. Итак, как указал GreenAsJade, вы можете получить максимальную разницу. Но вы также можете посмотреть на минимальную разницу, среднее значение и медиану всех различий и, возможно, даже на моду. Это может дать вам лучший обзор данных, а не только одно число. - person Andrew Robinson; 19.01.2014
comment
Это хорошая идея, чтобы получить несколько точек информации, которые я хотел бы понять как можно больше об этих группах и последовательностях (строках) в них! - person Jen; 19.01.2014