Reputation: 10033
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
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
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
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