Home > Blockchain >  Is there a way I can make a list out of this?
Is there a way I can make a list out of this?

Time:10-12

So I programmed this code to print out how many times a number would be printed in the list that I provided, and the output works, but I want to put all the values that I get into a list, how can I do that? This is my code...

i = [5,5,7,9,9,9,9,9,8,8]
def num_list(i):
    return [(i.count(x),x) for x in set(i)]

for tv in num_list(i):
    if tv[1] > 1:
        print(tv)

The output that I get is

(2, 8)
(5, 9)
(2, 5)
(1, 7)

but I want the output to be like

[2,8,5,9,2,5,1,7)

How can I do that??

CodePudding user response:

Just do:

tvlist = []
for tv in num_list(i):
    if tv[1] > 1:
        tvlist.extend(tv)

print(tvlist)

Or a list comprehension:

tvlist = [x for tv in num_list(i) if tv[1] > 1 for x in tv]

Also your function could just simply be collections.Counter:

from collections import Counter
def num_list(i):
    return Counter(i).items()

CodePudding user response:

flattened_iter = itertools.chain.from_iterable(num_list(i))
print(list(flattened_iter))

is how i would flatten a list

as mentioned by everyone else collections.Counter is likely to be significantly better performance for large lists...

if you would rather implement it yourself you can pretty easily

def myCounter(a_list):
    counter = {}
    for item in a_list:
        # in modern python versions order is preserved in dicts
        counter[item] = counter.get(item,0)   1
    for unique_item in counter:
        # make it a generator just for ease
        # we will just yield twice to create a flat list
        yield counter[unique_item]
        yield unique_item


i = [5,5,7,9,9,9,9,9,8,8]
print(list(myCounter(i)))

CodePudding user response:

Using a collections.Counter is more efficient. This paired with itertools.chain will get you your desired result:

from collections import Counter
from itertools import chain

i = [5,5,7,9,9,9,9,9,8,8]

r = list(chain(*((v, k) for k, v in Counter(i).items() if v > 1)))
print(r)

[2, 5, 5, 9, 2, 8]

Without itertools.chain

r = []
for k, v in Counter(i).items():
    if v > 1:
        r.extend((v, k))

CodePudding user response:

You can use end statement

i = [5, 5, 7, 9, 9, 9, 9, 9, 8, 8]

for x in set(i):
    print(i.count(x),x,end=" ")

Gives -- 2 8 5 9 2 5 1 7

  • Related