1

This is a great primer but doesn't answer what I need: Combining two sorted lists in Python

I have two Python lists, each is a list of datetime,value pairs:

list_a = [['1241000884000', 3], ['1241004212000', 4], ['1241006473000', 11]]

And:

list_x = [['1241000884000', 16], ['1241000992000', 16], ['1241001121000', 17], ['1241001545000', 19], ['1241004212000', 20], ['1241006473000', 22]]
  1. There are actually numerous list_a lists with different key/values.
  2. All list_a datetimes are in list_x.
  3. I want to make a list, list_c, corresponding to each list_a which has each datetime from list_x and value_a/value_x.

Bonus:

In my real program, list_a is actually a list within a dictionary like so. Taking the answer to the dictionary level would be:

dict = {object_a: [['1241000884000', 3], ['1241004212000', 4], ['1241006473000', 11]], object_b: [['1241004212000', 2]]}

I can figure that part out though.

2
  • 2
    why don't you use dictionaries instead of lists? Commented Apr 29, 2009 at 18:02
  • I could use a dictionary (or a set as recommended below). In the end though it needs to be a list because JSON will be looking for that. I'm fine with a dict answer. The answers below still aren't 100% even though I closed the question. Commented Apr 29, 2009 at 21:33

4 Answers 4

4

Here's some code that does what you asked for. You can turn your list of pairs into a dictionary straightforwardly. Then keys that are shared can be found by intersecting the sets of keys. Finally, constructing the result dictionary is easy given the set of shared keys.

dict_a = dict(list_a)
dict_x = dict(list_x)

shared_keys = set(dict_a).intersection(set(dict_x))

result = dict((k, (dict_a[k], dict_x[k])) for k in shared_keys)
Sign up to request clarification or add additional context in comments.

1 Comment

This seems good. Sets might be an easier option since my application won't have duplicate time stamps.
3

"I want to make a list, list_c, corresponding to each list_a which has each datetime from list_x and value_a/value_x."

def merge_lists( list_a, list_x ):
    dict_x= dict(list_x)
    for k,v in list_a:
        if k in dict_x:
            yield k, (v, dict_x[k])

Something like that may work also.

merged= list( merge_lists( someDict['object_a'], someDict['object_b'] )

This may be slightly quicker because it only makes one dictionary for lookups, and leaves the other list alone.

Comments

2

Nothing beats a nice functional one-liner:

reduce(lambda l1,l2: l1 + l2, list)

Comments

0

Could try extend:

list_a.extend(list_b)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.