2017-01-10 3 views
3

Я давно не занимаюсь python, и я довольно застрял в этой проблеме. У меня есть список, содержащий другие списки, каждый из которых содержит различное количество кортежей. Я попытался использовать ранее заданные вопросы, такие как grouping python lists of lists, sorting and grouping nested lists и другие методы, такие как использование счетчиков, но ни один из них, похоже, не работает в моем списке, выход которого выглядит следующим образом: (Это мои данные):группировка элементов в списке списков, содержащих кортежи python

[('T0931', 'AB', '0.7826705747628963')] [('T0932', 'AB', '0.63950861050628')] [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')] [('T0932', 'AB', '0.63950861050628')] [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')] 

Я думаю, что мой список (список кортежей) отформатирован по-другому, чем те, которые используются в других вопросах. Когда я спрашиваю его типа данных он приходит с списком, кортежем, строкой, но печатает эти ответы много раз:

print(type(Data)) 
# Returns list 
print(type(Data[0])) 
# Returns tuple 
print(type(Data[0][0])) 
# Returns str 

#output looks like this: 
<class 'list'> 
<class 'list'> 
<class 'list'> 
<class 'list'> 
<class 'list'> 

Даже когда я пытаюсь отсортировать этот список с помощью сортировки (второй попытки), они все варианты Возвращения же разгруппированы список разделенных многих пустых списков:

# Q is name of list 
#attempt 1:  
def grouper(sequence): 
      result = [] 

      for item in sequence: 
        for members, group in result: 
          if members.intersection(item): 
            members.update(item) 
            group.append(item) 
            break 
        else: 
          result.append((set(item), [item])) 
      return [group for members, group in result] 
    output=grouper(Q) 
    print(output) 

#attempt 2: 
import itertools 
    import operator 
    Q=sorted(q,key=operator.itemgetter(0)) 
    for key,group in itertools.groupby(Q,operator.itemgetter(0)): 
      print(list(group)) 

#attempt 3: 
from collections import Counter 
    C = Counter(Q) 
    for list,v in C.items(): 
      print ([list,]*v) 

Я хотел бы, чтобы сгруппировать этот список первым по количеству TXXXX в положении 0, то с помощью двух букв в положении 1, сохраняя при этом все повторяющиеся элементы в каждой группе. Однако подробное объяснение того, как группировать номер Txxxx, было бы полезно, поэтому я могу выяснить, как сделать то же самое для букв в позиции 1. Нужный результат должен выглядеть следующим образом:

[[('T0931', 'AB', '0.7826705747628963')],[('T0932', 'AB', '0.6395086105062'),('T0932', 'AB', '0.63950861050628')],[('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'), ('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]] 

Кроме того, в этом случае я не верю, что делает словарь будет работать (то, что я видел, делал в подобных вопросах), как это только образец списка, полный список содержит много разных номеров Txxxx в позиции 0.

Спасибо заранее.

+0

Из того, что вы предоставили, я не верю, что ваши данные - это список списков. Могли бы вы также обеспечить ожидаемый ввод и желаемый результат? Это немного запутанно, не имея возможности визуально видеть, что вы хотите. –

+0

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

ответ

0

Вы можете использовать defaultdict, чтобы сохранить все значения для каждой комбинации ТХ/код

from collections import defaultdict 

d = defaultdict(list) 
for group in q: 
    for tx, code, value in group: 
     d[tx, code].append(value) 
+0

К сожалению, этот метод привел к ошибке: 'слишком много значений для распаковки (ожидается 3)' – Emma

+1

@Emma Try, 'для tx, code, * значение в группе: d [tx, code] .append (value)'. Просто добавьте значение '*', чтобы разрешить любое количество следующих элементов в одну переменную. Это должно быть только в том случае, если ваши кортежи имеют более 3 предметов. –

0

Вы можете использовать группу мимо, так же, как это:

my_list=[('T0931', 'AB', '0.7826705747628963'),('T0932', 'AB', '0.63950861050628'), 
('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), 
('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), 
('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'), 
('T0932', 'AB', '0.63950861050628'),('T0933', 'AB', '0.8960345460457968'), 
('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), 
('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), 
('T0933', 'EF', '0.8941510860547524')] 
import itertools 

res =[] 
for key, value in itertools.groupby(my_list, lambda x: x[0]): 
    l=[] 
    for val in value : 
     l.append(val) 
    res.append(l) 

Выход:

[[('T0931', 'AB', '0.7826705747628963')], [('T0932', 'AB', '0.63950861050628')], [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')], [('T0932', 'AB', '0.63950861050628')], [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]] 
+0

@ KHELILI Hamza есть способ сделать вывод более похожим на [[('T0931', 'AB', '0.7826705747628963')], [('T0932', 'AB', '0.6395086105062'), (' T0932 ',' AB ',' 0.63950861050628 ')], [(' T0933 ',' AB ',' 0.8960345460457968 '), (' T0933 ',' AF ',' 0.8951297220212914 '), (' T0933 ',' BC ' , '' T0933 ',' DE ',' 0.8951299080330034 '), (' T0933 ',' EF ',' 0.8941510860547524 '), (' T0933 ',' CD ',' 0.8951298105762795 '), T0933 ',' AB ',' 0.8960345460457968 '...)]] ', чтобы каждый номер Txxxx имел свой собственный список со всеми экземплярами кортежей, содержащих этот номер Txxxx в этом списке? – Emma

Смежные вопросы