简体   繁体   中英

adding empty string while joining the 2 lists - Python

I have 2 lists

mainlist=[['RD-12',12,'a'],['RD-13',45,'c'],['RD-15',50,'e']] and 
sublist=[['RD-12',67],['RD-15',65]]

if i join both the list based on 1st element condition by using below code

def combinelist(mainlist,sublist):
   dict1 = { e[0]:e[1:] for e in mainlist }
   for e in sublist:
      try:
         dict1[e[0]].extend(e[1:])
      except:
         pass
   result = [ [k] + v for k, v in dict1.items() ]
   return result

Its results in like below

[['RD-12',12,'a',67],['RD-13',45,'c',],['RD-15',50,'e',65]]

as their is no element in for 'RD-13' in sublist, i want to empty string on that.

The final output should be

[['RD-12',12,'a',67],['RD-13',45,'c'," "],['RD-15',50,'e',65]]

Please help me.

You could just go through the result list and check where the total number of your elements is 2 instead of 3.

for list in lists:
    if len(list) == 2:
        list.append(" ")

UPDATE:

If there are more items in the sublist, just subtract the lists containing the 'keys' of your lists, and then add the desired string.

def combinelist(mainlist,sublist):
   dict1 = { e[0]:e[1:] for e in mainlist }
   list2 = [e[0] for e in sublist]
   for e in sublist:
      try:
         dict1[e[0]].extend(e[1:])
      except:
         pass
   for e in dict1.keys() - list2:
       dict1[e].append(" ")
   result = [[k] + v for k, v in dict1.items()]
   return result

Your problem can be solved using a while loop to adjust the length of your sublists until it matches the length of the longest sublist by appending the wanted string.

for list in result:
    while len(list) < max(len(l) for l in result):
        list.append(" ")

You can try something like this:

mainlist=[['RD-12',12],['RD-13',45],['RD-15',50]]
sublist=[['RD-12',67],['RD-15',65]]
empty_val = ''

# Lists to dictionaries
maindict = dict(mainlist)
subdict = dict(sublist)
result = []
# go through all keys
for k in list(set(list(maindict.keys()) + list(subdict.keys()))):
    # pick the value from each key or a default alternative
    result.append([k, maindict.pop(k, empty_val), subdict.pop(k, empty_val)])
# sort by the key
result = sorted(result, key=lambda x: x[0])

You can set up your empty value to whatever you need.

UPDATE

Following the new conditions, it would look like this:

mainlist=[['RD-12',12,'a'], ['RD-13',45,'c'], ['RD-15',50,'e']]
sublist=[['RD-12',67], ['RD-15',65]]

maindict = {a:[b, c] for a, b, c in mainlist}
subdict = dict(sublist)
result = []

for k in list(set(list(maindict.keys()) + list(subdict.keys()))):
    result.append([k, ])
    result[-1].extend(maindict.pop(k, ' '))
    result[-1].append(subdict.pop(k, ' '))

sorted(result, key=lambda x: x[0])

Another option is to convert the sublist to a dict, so items are easily and rapidly accessible.

sublist_dict  = dict(sublist)

So you can do (it modifies the mainlist ):

for i, e in enumerate(mainlist):
  data: mainlist[i].append(sublist_dict.get(e[0], ""))
#=> [['RD-12', 12, 'a', 67], ['RD-13', 45, 'c', ''], ['RD-15', 50, 'e', 65]]

Or a one liner list comprehension (it produces a new list):

[ e + [sublist_dict.get(e[0], "")] for e in mainlist ]


If you want to skip the missing element:

 for i, e in enumerate(mainlist): data = sublist_dict.get(e[0]) if data: mainlist[i].append(data) print(mainlist) #=> [['RD-12', 12, 'a', 67], ['RD-13', 45, 'c'], ['RD-15', 50, 'e', 65]] 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM