Python Forum
Using function argument in lists comprehension. - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Using function argument in lists comprehension. (/thread-17780.html)



Using function argument in lists comprehension. - blackknite - Apr-23-2019

def nb_dig(n,d):
    r = [n**2 for n in range(1,n)]
    digz = [d for d in r]
    print(r,digz)
nb_dig(10,1)
Output:
>>>[1, 4, 9, 16, 25, 36, 49, 64, 81] [1, 4, 9, 16, 25, 36, 49, 64, 81]
So, I want 'd' to be a string value, telling me how many times certain number occurs in the results, but instead of it I get some bs. Why the damn 'd' in digz is not imported from the function parameters?


RE: Using function argument in lists comprehension. - Yoriz - Apr-23-2019

d is not a string value, you pass in the number 1 as d
digz = [d for d in r] is not counting how many times d is in r, its making a new copy of r, d is added to a list for each d that is assigned from each item in r(the d that was passed in is overwriten).
to count how many times d is in r use count and if you want it to be a string convert it using str
def nb_dig(n,d):
    r = [n**2 for n in range(1,n)]
#     digz = [d for d in r]
    digz = str(r.count(d))
    print(r,digz)
nb_dig(10,1)
Output:
[1, 4, 9, 16, 25, 36, 49, 64, 81] 1
Unless you want this, im not really sure what you want Huh
def nb_dig(n,d):
    r = [n**2 for n in range(1,n)]
    digz = [str(d) for _ in r if _ == d]
#     digz = str(r.count(d))
    print(r,digz)
nb_dig(10,1)
Output:
[1, 4, 9, 16, 25, 36, 49, 64, 81] ['1']



RE: Using function argument in lists comprehension. - Larz60+ - Apr-23-2019

It works as written:
>>> def nb_dig(n,d):
...     print(f'n: {n}, d: {d}')
...     r = [n**2 for n in range(1,n)]
...     print(f'r: {r}')
...     digz = [d for d in r]
...     print(f'digz: {digz}')
... 
>>> nb_dig(10,1)
n: 10, d: 1
r: [1, 4, 9, 16, 25, 36, 49, 64, 81]
digz: [1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>
this statement: digz = [d for d in r] overwrites original d (one passed in)


RE: Using function argument in lists comprehension. - blackknite - Apr-23-2019

It should count all the paremeter given digits in the string and Im still doing something wrong somehow.

def nb_dig(n,d):
    r = [n**2 for n in range(1,n)]
    digz = [r.count(d)]
    print(r,digz)

nb_dig(10,1)
>>>[1, 4, 9, 16, 25, 36, 49, 64, 81] [1]
And the result(1) is wrong cause the '1' occurs 3 times in that particular string.


RE: Using function argument in lists comprehension. - Yoriz - Apr-23-2019

I don't understand, there is no string, there is a list of numbers of which the number 1 only appears once.

Edit: The closest i can get to guessing what your after is the following
def nb_dig(n,d):
    r = [n**2 for n in range(1,n)]
    count = 0
    for item in r:
        if str(d) in str(item):
            count +=1

    print(r,count)
 
nb_dig(10,1)
Output:
[1, 4, 9, 16, 25, 36, 49, 64, 81] 3



RE: Using function argument in lists comprehension. - snippsat - Apr-23-2019

Can also make it a string,and then count.
As string count() method counts occurrences of substring,and list count() method counts whole values in list.
>>> lst = [1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> s = ''.join(str(i) for i in lst)
>>> s
'149162536496481'
>>> s.count('1')
3

>>> help(s.count)
Help on method_descriptor:

count(...)
    S.count(sub[, start[, end]]) -> int
    
    Return the number of non-overlapping occurrences of substring sub in
    string S[start:end].  Optional arguments start and end are
    interpreted as in slice notation.