List comparison of element

  • A+

I have a question and it is a bit hard for me to explain so I will be using lots of examples to help you all understand and see if you could help me.

Say I have two lists containing book names from best to worst rated by two people. User1 rated lstA, and user2 rated lstB

lstA = ['Harry Potter','1984','50 Shades','Dracula'] lstB = ['50 Shades','Dracula','1984','Harry Potter'] 

User one thinks 'Harry Potter' is better than 'Dracula' (HP is index 0, and Dracula is index 3)

User two thinks 'Harry Potter' is worse than Dracula, (HP is index 3 and Dracula is index 1)

In this case, return a tuple ('Harry Potter', 'Dracula') [('Dracula', 'Harry Potter') is also fine]

User one also rated '50 shades' better than 'Dracula' and user two also rated '50 shades' better than 'Dracula' (index 2, 3 and 0, 1 respectively). In this case, nothing happens.

The final result of the program should return a list of tuples so,

[('Harry Potter','50 Shades'), ('Harry Potter','Dracula'), ('Harry Potter','1984'), ('1984', '50 Shades'), ('1984','Dracula')] 

Could someone help me to point me in the right direction to come up with an algorithm that gives all the tuples?


First formulate your logic mathematically. For all combinations of length 2, given indices idx_a1, idx_a2 and idx_b1, idx_b2, if sign(idx_a1 - idx_a2) != sign(idx_b1 - idx_b2), record the combination.

The below isn't efficient, but it shows one way of transforming this logic to code:

from itertools import combinations  lstA = ['Harry Potter','1984','50 Shades','Dracula'] lstB = ['50 Shades','Dracula','1984','Harry Potter']  def sign(x):     """Return +1 if integer is positive, -1 if negative"""     return (x > 0) - (x < 0)  res = [] for a, b in combinations(lstA, 2):     idx_a1, idx_a2 = lstA.index(a), lstA.index(b)     idx_b1, idx_b2 = lstB.index(a), lstB.index(b)     if sign(idx_a1 - idx_a2) != sign(idx_b1 - idx_b2):         res.append((a, b))  [('Harry Potter', '1984'),  ('Harry Potter', '50 Shades'),  ('Harry Potter', 'Dracula'),  ('1984', '50 Shades'),  ('1984', 'Dracula')] 


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: