gython
gython

Reputation: 875

How to concatenate a list with a nested list?

I have two lists:

The first one is a regular list which contains links of Sitemaps:

ur = ['https://www.hi.de/hu/sitemap.xml', 
      'https://www.hi.de/ma/sitemap.xml', 
      'https://www.hi.de/au/sitemap.xml', 
      ]

The second list is nested and contains links which were indexed on the sitemaps and a date for every link:

wh = [['No-Date', 'https://www.hi.de/hu/artikel/xxx', ''],        
      ['2019-11-13', 'https://www.hi.de/ma/artikel/xxx'], 
      ['2019-11-12', 'https://www.hi.de/ma/artikel/xxx'], 
      ['2019-11-11', 'https://www.hi.de/au/artikel/xxx']]

Now I want to merge the list with the nedted list based on the sitmap they came from like this:

ui = [['https://www.hi.de/hu/sitemap.xml', 'No-Date', 'https://www.hi.de/hu/artikel/xxx', ''],        
      ['https://www.hi.de/ma/sitemap.xml' '2019-11-13', 'https://www.hi.de/ma/artikel/xxx'], 
      ['https://www.hi.de/ma/sitemap.xml', '2019-11-12', 'https://www.hi.de/ma/artikel/xxx'], 
      ['https://www.hi.de/au/sitemap.xml', '2019-11-11', 'https://www.hi.de/au/artikel/xxx']]

But with my code:

ui = [[(url2, x) for url2 in ur for x in y if url2.rsplit('/', 1)[0] in x] for y in wh]

The date in every sublist gets deleted and additionally the entries are stored in a tuple like this:

...
[[('https://www.hi.de/hu/sitemap.xml', 'https://www.hi.de/hu/artikel/xxx', '')],
...

How can I change the code to get the desired result in the variable ui?

Upvotes: 7

Views: 457

Answers (6)

brandonbanks
brandonbanks

Reputation: 1295

You can also use enumerate.

ui = [[x] + wh[i] for i,x in enumerate(ur)]
print(ui)

Output:

[
    ['https://www.hi.de/hu/sitemap.xml','No-Date','https://www.hi.de/hu/artikel/xxx',''],
    ['https://www.hi.de/ma/sitemap.xml', '2019-11-13','https://www.hi.de/ma/artikel/xxx'],
    ['https://www.hi.de/au/sitemap.xml','2019-11-12','https://www.hi.de/ma/artikel/xxx']
]

Upvotes: 1

Filip Młynarski
Filip Młynarski

Reputation: 3612

You could combine elements of your list with double for loop, unpack values of second list using *-operator, and save them all using list comprehension.

ui = [
    [i, *j] 
    for i in ur for j in wh 
    if i.split('/')[3] == j[1].split('/')[3]
]

print(ui)

Output:

[
    ['https://www.hi.de/hu/sitemap.xml', 'No-Date', 'https://www.hi.de/hu/artikel/xxx', ''],
    ['https://www.hi.de/ma/sitemap.xml', '2019-11-13', 'https://www.hi.de/ma/artikel/xxx'],
    ['https://www.hi.de/ma/sitemap.xml', '2019-11-12', 'https://www.hi.de/ma/artikel/xxx'],
    ['https://www.hi.de/au/sitemap.xml', '2019-11-11', 'https://www.hi.de/au/artikel/xxx']
]

Upvotes: 2

Ajax1234
Ajax1234

Reputation: 71451

You can transform ur to a dictionary for easier lookup:

import re
ur = ['https://www.hi.de/hu/sitemap.xml', 'https://www.hi.de/ma/sitemap.xml', 'https://www.hi.de/au/sitemap.xml']
data = [['No-Date', 'https://www.hi.de/hu/artikel/xxx'], ['2019-11-13', 'https://www.hi.de/ma/artikel/xxx'], ['2019-11-12', 'https://www.hi.de/ma/artikel/xxx'], ['2019-11-11', 'https://www.hi.de/au/artikel/xxx']]
d = dict((re.split('/(?=sitemap\.)', i)[0], i) for i in ur)
result = [[d[re.split('/(?=\w{3,}/)', b)[0]], a, b] for a, b in data]

Output:

[['https://www.hi.de/hu/sitemap.xml', 'No-Date', 'https://www.hi.de/hu/artikel/xxx'], 
['https://www.hi.de/ma/sitemap.xml', '2019-11-13', 'https://www.hi.de/ma/artikel/xxx'], 
['https://www.hi.de/ma/sitemap.xml', '2019-11-12', 'https://www.hi.de/ma/artikel/xxx'], 
['https://www.hi.de/au/sitemap.xml', '2019-11-11', 'https://www.hi.de/au/artikel/xxx']]

Upvotes: 4

Austin
Austin

Reputation: 26039

You can use a list comprehension that checks for the matching sitemap between two lists to get your desired result:

ur = ['https://www.hi.de/hu/sitemap.xml', 
      'https://www.hi.de/ma/sitemap.xml', 
      'https://www.hi.de/au/sitemap.xml', 
      ]

wh = [['No-Date', 'https://www.hi.de/hu/artikel/xxx', ''],        
      ['2019-11-13', 'https://www.hi.de/ma/artikel/xxx'], 
      ['2019-11-12', 'https://www.hi.de/ma/artikel/xxx'], 
      ['2019-11-11', 'https://www.hi.de/au/artikel/xxx']]

print([[[u] + x] for x in wh for u in ur if x[1].split('/')[3] == u.split('/')[3]])

which outputs:

[['https://www.hi.de/hu/sitemap.xml', 'No-Date', 'https://www.hi.de/hu/artikel/xxx', ''],
 ['https://www.hi.de/ma/sitemap.xml' '2019-11-13', 'https://www.hi.de/ma/artikel/xxx'],
 ['https://www.hi.de/ma/sitemap.xml', '2019-11-12', 'https://www.hi.de/ma/artikel/xxx'],
 ['https://www.hi.de/au/sitemap.xml', '2019-11-11', 'https://www.hi.de/au/artikel/xxx']]

Upvotes: 5

han solo
han solo

Reputation: 6590

You could do a aimple list comprehension like,

>>> ur
['https://www.hi.de/hu/sitemap.xml', 'https://www.hi.de/ma/sitemap.xml', 'https://www.hi.de/au/sitemap.xml']
>>> wh
[['No-Date', 'https://www.hi.de/hu/artikel/xxx', ''], ['2019-11-13', 'https://www.hi.de/ma/artikel/xxx'], ['2019-11-12', 'https://www.hi.de/ma/artikel/xxx'], ['2019-11-11', 'https://www.hi.de/au/artikel/xxx']]
>>> [[u] + w for u,w in zip(ur, wh)]
[['https://www.hi.de/hu/sitemap.xml', 'No-Date', 'https://www.hi.de/hu/artikel/xxx', ''], ['https://www.hi.de/ma/sitemap.xml', '2019-11-13', 'https://www.hi.de/ma/artikel/xxx'], ['https://www.hi.de/au/sitemap.xml', '2019-11-12', 'https://www.hi.de/ma/artikel/xxx']]

Upvotes: 1

Daniel Marchand
Daniel Marchand

Reputation: 644

Try using a zip:

[(x[0],x[1][0],x[1][1]) for x in zip(ur, wh)]

Upvotes: 0

Related Questions