2015-12-15 3 views
3

у меня есть такие данные:Переместить некоторую часть колонки к другому питона

[(1, 11), (1, 31), (1, 41), (1, 61), (1, 71), (2, 2), (3, 3), (3, 13), (3, 23), (3, 43), (3, 53), (3, 73), (3, 83), (5, 5), (7, 7), (7, 17), (7, 37), (7, 47), (7, 67), (7, 97), (9, 19), (9, 29), (9, 59), (9, 79), (9, 89)] 

И я пытаюсь записать его в файл в этой схеме:

(1, 11) (2, 2) (3, 3) (5, 5) (7, 7) (9, 19) 
(1, 31)   (3, 13)   (7, 17) (9, 29) 
(1, 31)   (3, 23)   (7, 37) (9, 59) 

Вот часть моего код:

def modulo(inputlist, divider): 
    tmplist = [] 
    for item in inputlist: 
     for i in range(divider): 
      if item % divider == i: 
       tmptuple = (i, item) 
       tmplist.append(tmptuple) 
    return tmplist 

modulo_list = modulo(a, 10) 
modulo_list.sort(key=lambda tup:tup[0]) 

with open ('modulo_primes.csv', 'w') as out: 
    csv_out=csv.writer(out) 
    csv_out.writerow(['modulo', 'primary']) 
    for row in modulo_list: 
     csv_out.writerow(row) 

В этом случае я использую формат csv, но csv не требуется. Я просто хочу форматировать данные первичных чисел в столбце, зависит от работы модуля (функция modulo).

Мой пример modulo 10 case, но я планирую распространить его на другие значения. Переменная «a» представляет собой простой список простых чисел.

ответ

4

Вы можете использовать itertools.groupby для группировки кортежей с помощью первого элемента с использованием itemgetter(0) в качестве ключа и itertools.zip_longest для переноса данных в столбцы.

l =[(1, 11), (1, 31), (1, 41), (1, 61), (1, 71), (2, 2), (3, 3), (3, 13), (3, 23), (3, 43), (3, 53), (3, 73), (3, 83), (5, 5), (7, 7), (7, 17), (7, 37), (7, 47), (7, 67), (7, 97), (9, 19), (9, 29), (9, 59), (9, 79), (9, 89)] 

from itertools import groupby, zip_longest 
from operator import itemgetter 


with open("out.csv","w") as f: 
    r = csv.writer(f,delimiter="\t") 
    # itertools.izip_longest for python2 
    r.writerows(zip_longest(*(list(v) for k, v in groupby(l, 
           key=itemgetter(0))),fillvalue=" ")) 

out.csv:

(1, 11) (2, 2) (3, 3) (5, 5) (7, 7) (9, 19) 
(1, 31)   (3, 13)   (7, 17) (9, 29) 
(1, 41)   (3, 23)   (7, 37) (9, 59) 
(1, 61)   (3, 43)   (7, 47) (9, 79) 
(1, 71)   (3, 53)   (7, 67) (9, 89) 
       (3, 73)   (7, 97)  
       (3, 83)      

Если вы хотите столбцы для выравнивания необходимо использовать str.format, используя количество символов, которые будут в самом большом наборе:

mx = max((len(str(t)) for t in l)) 
with open("out.csv", "w") as f: 
    for row in zip_longest(*(list(v) for k, v in groupby(l, key=itemgetter(0))), fillvalue=" "): 
     print(row) 
     f.write(" ".join("{:<{mx}}".format(str(t), mx=mx) for t in row)+"\n") 

Так что для ввода данных, например:

l = [(1, 11), (1, 31), (1, 41), (1, 61), (1, 71), (2, 2), (3, 3), (3, 13), (3, 23), (3, 43), (3, 53), (3, 73), (3, 83), 
(5, 5), (7, 7), (7, 17), (7, 3447), (7, 47), (7, 67444), (7, 97), (9, 19), (9, 29), (9, 59), (9, 79), (9, 899)] 

Вы получите:

(1, 11) (2, 2)  (3, 3)  (5, 5)  (7, 7)  (9, 19) 
(1, 31)    (3, 13)    (7, 17) (9, 29) 
(1, 41)    (3, 23)    (7, 3447) (9, 59) 
(1, 61)    (3, 43)    (7, 47) (9, 79) 
(1, 71)    (3, 53)    (7, 67444) (9, 899) 
         (3, 73)    (7, 97)    
         (3, 83)          
+1

[ 'itertools'] (https://docs.python.org/3/library/itertools.html) и [' operator'] (https: //docs.python .org/3/library/operator.html) –

+0

@BhargavRao, спасибо, спас меня google;) –

+0

Wut? Google? Naw ... docs.python.org//library/modulename.html ...: P –

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