Python, отформатируйте этот список - PullRequest
1 голос
/ 12 октября 2010

У меня есть список вроде [(1, 2), (1, 8), (2, 3), (2, 7), (2, 8), (2, 9), (3,1), (3, 2), (3, 5), (3, 6), (3, 7), (3, 7), (3, 9)]

Я хочу сделать этовыглядит как [('1', '', '2', '8'), ('2', '', '3', '7', '8', '9'), ('3',«», «2», «5», «6», «7», «7», «9»)]

Как мне кодировать этот цикл?Действительно испытанные времена, и ничего не подошло.Пожалуйста, помогите ~~

Ответы [ 4 ]

2 голосов
/ 12 октября 2010
from collections import defaultdict

s = [
    (1,2),(1,8),
    (2,3),(2,7),(2,8),(2,9),
    (3,1),(3,2),(3,5),(3,6),(3,7),(3,7),(3,9)
    ]

D = defaultdict(list)
for a,b in s:
    D[a].append(b)

L = []
for k in sorted(D.keys()):
    e = [str(k),'']
    e.extend(map(str,D[k]))
    L.append(tuple(e))

print L

Выход:

[('1', '', '2', '8'), ('2', '', '3', '7', '8', '9'), ('3', '', '1', '2', '5', '6', '7', '7', '9')]

Ты должен объяснить, как это работает твоему учителю; ^)

2 голосов
/ 12 октября 2010

Не совсем то, что вы просили, но, может быть, проще работать?

>>> from itertools import groupby
>>> L = [(1, 2), (1, 8), (2, 3), (2, 7), (2, 8), (2, 9), (3, 1), (3, 2), (3, 5), (3, 6), (3, 7), (3, 7), (3, 9)]
>>> for key, group in groupby(L, lambda x: x[0]):
...     print key, list(group)
... 
1 [(1, 2), (1, 8)]
2 [(2, 3), (2, 7), (2, 8), (2, 9)]
3 [(3, 1), (3, 2), (3, 5), (3, 6), (3, 7), (3, 7), (3, 9)]

Ссылка на документацию .

Edit:
Я полагаю, что-то вроде этого - больше, чем вы просите:

>>> d = {}
>>> for key, group in groupby(L, lambda x: x[0]):
...     d[key] = [i[1] for i in group]
... 
>>> d
{1: [2, 8], 2: [3, 7, 8, 9], 3: [1, 2, 5, 6, 7, 7, 9]}

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

d[str(key)] = [i[1] for i in group]
2 голосов
/ 12 октября 2010

Шаг 1. Преобразуйте список в словарь.Каждый элемент представляет собой список значений с общим ключом.(Подсказка: ключ является первым значением каждой пары)

Шаг 2. Теперь отформатируйте каждый словарь как ключ, пробел, список значений.

0 голосов
/ 12 октября 2010
a = [(1, 2), (1, 8), (2, 3), (2, 7), (2, 8), (2, 9), (3, 1), (3, 2), (3, 5), (3, 6),  (3, 7), (3, 7), (3, 9)]

x1=None  # here we keep track of the last x we saw
ys=None  # here we keep track of all ys we've seen for this x1

result = [] 

for x,y in a:
    if x != x1:  # this is an x we haven't seen before
        if ys:   # do we have results for the last x?
            result.append( ys ) 
        ys = [ x, '', y ] # initialize the next set of results
        x1 = x
    else:
        ys.append( y ) # add this to the results we are buliding

if ys:
    result.append( ys )  # add the last set of results

print result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...