8-Bit Borges
8-Bit Borges

Reputation: 10033

Python - set items on a list to a list of dictionary values

Given the list:

links = [ 'link1', 'link2', 'link3', 'link3', 'link4', 'link5', 'link6', 'link6', 'link7', 'link8', 'link9', 'link10']

and this list of dicts:

 sources =  [{'src': ''}, {'src': ''}, {'src': ''}, {'src': ''}, {'src': ''}, {'src': ''}, {'src': ''}, {'src': ''}, {'src': ''}, {'src': ''}]

I would like to set each src value to its correspondant link, like so:

{'src': 'link1'}, {'src': 'link2'}...

I have tried:

for s in sources:
    for l in links:
        s['src'] = l
        print (s)

but this does the job 10 times, and I'd like to have it done only once.

How can I achieve this with a one-liner?

Upvotes: 1

Views: 63

Answers (3)

Ari Gold
Ari Gold

Reputation: 1548

links = [ 'link1', 'link2', 'link3', 'link3', 'link4', 'link5', 'link6', 'link6', 'link7', 'link8', 'link9', 'link10']

sources = [dict(src = ln) for ln in links]
print sources

[{'src': 'link1'}, {'src': 'link2'}, {'src': 'link3'}, {'src': 'link3'}, {'src': 'link4'}, {'src': 'link5'}, {'src': 'link6'}, {'src': 'link6'}, {'src': 'link7'}, {'src': 'link8'}, {'src': 'link9'}, {'src': 'link10'}]

print map(lambda v: dict(src = v), links)

or

# for python 3
print (list(map(lambda v: dict(src = v), links)))

[{'src': 'link1'}, {'src': 'link2'}, {'src': 'link3'}, {'src': 'link3'}, {'src': 'link4'}, {'src': 'link5'}, {'src': 'link6'}, {'src': 'link6'}, {'src': 'link7'}, {'src': 'link8'}, {'src': 'link9'}, {'src': 'link10'}]

Upvotes: 2

georg
georg

Reputation: 214959

I assume there's something else in src dicts, otherwise sources would make little sense:

for src, link in zip(sources, links):
    src['src'] = link

It is possible to write that as one-liner:

[s.update({'src': x }) for s, x in zip(sources, links)]

but this would be a so-called "comprehension with side effects" and considered bad taste by most pythonistas. A loop is far more pythonic.

The above also assumes that len(sources)==len(links) otherwise consider:

for src, link in zip(sources, itertools.cycle(links)):
    src['src'] = link

which will populate links in a round-robin fashion.

If these src dicts are actually empty, there's no need to keep a list of them, just create it from the scratch:

 sources = [{'src': x} for x in links]

Upvotes: 4

wim
wim

Reputation: 362657

I would not rcecommend a one-liner here. Just a simple for-loop is best:

>>> for d,link in zip(sources, links):
...     d['src'] = link
>>> print(sources)
[{'src': 'link1'}, {'src': 'link2'}, {'src': 'link3'}, {'src': 'link3'}, {'src': 'link4'}, {'src': 'link5'}, {'src': 'link6'}, {'src': 'link6'}, {'src': 'link7'}, {'src': 'link8'}]

Upvotes: 2

Related Questions