Print list without duplicate items

Is it possible to print a list, such as a table, but skip parts of identical data columns?

For example, my list:

l = [('name1','species','description','country','n/a'),
     ('name1','species','description','country','plasmid1'),
     ('name1','species','description','country','plasmid2')]


for l in list_description:
    print '\t'.join(l)

What I get:

name1 species description country n/a
name1 species description country plasmid1
name1 species description country plasmid2

What I hope to receive:

name1 species description country n/a
                                  plasmid1
                                  plasmid2

If this is not possible with a table, I can also use a dictionary.

+4
source share
4 answers

Adam's solution is good, but I also want to provide one that uses, as you said, a dictionary. Thus, you have even more flexibility in data analysis, you do not need to worry about the order, and the add operation is also a little easier:

l = [('name1','species','description','country','n/a'),
     ('name1','species','description','country','plasmid1'),
     ('name1','species','description','country','plasmid2')]

d = {}
for line in l:
  key, val = ' '.join(line[:-1]), line[-1]
  if key in d:
    d[key] += '\n' + ' '*(len(key)+1) + val
  else:
    d[key] = val

for key, val in d.items():
  print("{} {}".format(key, val))

Conclusion:

name1 species description country n/a
                                  plasmid1
                                  plasmid2
+2
source

you can track the last line printed, compare them, and then replace the same elements with an equivalent number of spaces.

import itertools

l = [('name1','species','description','country','n/a'),
     ('name1','species','description','country','plasmid1'),
     ('name1','species','description','country','plasmid2')]

last_line = []
for ll in l:
    line = [" "*len(el_l) if el_l == el_last else el_l
            for el_l, el_last in itertools.zip_longest(ll, last_line, fillvalue=None)]
    last_line = ll
    print("\t".join(line))
+3
source

, :

l = [('name1','species','description','country','n/a'),
     ('name1','species','description','country','plasmid1'),
     ('name1','species','description','country','plasmid2')]

print ' '.join([l[j][i]+"\n"*int(i==len(l[j])-1) if len(set([k[i] for k in l])) == len(l) or j==0 else ' '*len([k[i] for k in l][0]) for j in range(len(l)) for i in range(len(l[j]))])

name1 species description country n/a
                                   plasmid1
                                   plasmid2

>>> 
+1

If a tupleis in index 0at list_description, print all items tupleseparated by a space. Otherwise, type spaces, plus an element in the index -1in each tuple.

list_description = [('name1','species','description','country','n/a'),
                    ('name1','species','description','country','plasmid1'),
                    ('name1','species','description','country','plasmid2')]

lengths = sum(len(item) for item in list_description[0])

for i, tup in enumerate(list_description):    
    if i == 0:
        print(' '.join(tup[:-1]) + ' ' + tup[-1])        
    else:
        print(' ' * lengths + ' ' + tup[-1])

name1 species description country n/a
                                  plasmid1
                                  plasmid2
>>> 
0
source

Source: https://habr.com/ru/post/1690841/


All Articles