Strayhorn
Strayhorn

Reputation: 729

Matching a list's item with another list in python

I have list1 let's say:

items=['SETTLEMENT DATE:', 'CASH ACCOUNT:', 'ISIN:', 'TRADE DATE:', 'PRICE CFA', 'CASH ACCOUNT:', 'SECURITY NAME:']

I have a list2 let's say:

split_t=['{1:F01SCBLMUMUXSSU0438794344}{2:O5991054200218SCBLGHACXSSU04387943442002181454N}{3:{108:2175129}}{4:', ':20:EPACK', 'SALE', 'CDI', ':21:EPACK', 'SALE', 'CDI', ':79:ATTN:MU', 'TEAM', 'KINDLY', 'ACCEPT', 'THIS', 'AS', 'AUTHORISATION', 'TO', 'SETTLE', 'TRADE', 'WITH', 'DETAILS', 'BELOW', 'MARKET:', 'COTE', 'DIVOIRE', 'CLIENT', 'NAME:', 'EPACK', 'OFFSHORE', 'ACCOUNT', 'NAME:', 'STANDARD', 'CHARTERED', 'GHANA', 'NOMINEE', 'RE', 'DATABANK', 'EPACK', 'INVESTMENT', 'FUND', 'LTD', 'IVORY', 'COAST', 'TRADE', 'TYPE:', 'DELIVER', 'AGAINST', 'PAYMENT', 'SCA:', '2CEPACKIVO', 'CASH', 'ACCOUNT:', '420551901501', 'TRADE', 'DETAILS:', 'TRADE', 'DATE:', '17.02.2020', 'SETTLEMENT', 'DATE:', '20.02.2020', 'SECURITY', 'NAME:', 'SONATEL', 'ISIN:', 'SN0000000019', 'CLEARING', 'BIC:', 'SCBLCIABSSUXXX', 'QUANTITY:', '10,500', 'PRICE', 'CFA', '14,500.4667', 'CONSIDERATION', 'CFA', '152,254,900.00', 'TOTAL', 'FEES', '1,796,608.00', 'SETTLEMENT', 'AMOUNT', 'CFA', '150,458,292.35', 'CURRENCY:', 'CFA', 'AC:', 'CI0000010373', 'REGARDS', 'STANDARD', 'CHARTERED', 'BANK', '-}']

I want to search contiguously the items of list1 in list2 and return the immediate next element of list2 when there's a match.

As you can see, one item of list1 is probably two contiguous item in list2. For example, the 1st element of list1, 'SETTLEMENT DATE:', There's a match in list2 and I want to return the next element of the match in list2, '20.02.2020'.

I have written my python function accordingly:

def test(items, split_t):
    phrases = [w for w in items]
    for i, t in enumerate(split_t):
        to_match = split_t[i+1: i+1+len(phrases)]
        if to_match and all(p == m for p,m in zip(phrases, to_match)):
            return [*map(lambda x:split_t[i])]

Which is returning None even when it has matches as you can see. I might be wrong in implementing the *map in the return statement which I'm failing to understand from debugging. Any help is highly appreciated.

Upvotes: 0

Views: 633

Answers (2)

Nikolaos Chatzis
Nikolaos Chatzis

Reputation: 1979

One way is:

>>> import re
>>> def test(items, split_t):
...     split_t_str = ' '.join(split_t)
...     res = {}
...     for i in items:
...         m = re.search(rf'(?<={i})\s(.*?)\s', split_t_str)
...         res[i] = m.group(1)
...     return res
... 
>>> test(items, split_t)
{'SETTLEMENT DATE:': '20.02.2020', 'CASH ACCOUNT:': '420551901501', 'ISIN:': 'SN0000000019', 'TRADE DATE:': '17.02.2020', 'PRICE CFA': '14,500.4667', 'SECURITY NAME:': 'SONATEL'}

The above:

  1. creates a str from split_t, i.e., split_t_str,
  2. iterates over items using each element to construct a regex for performing a positive lookbehind assertion (see re's docs) against split_t_str,
  3. stores each element as key in a dict, called res, and the corresponding match as value, and
  4. returns the dict

Upvotes: 1

yazilimalanlari
yazilimalanlari

Reputation: 11

If there is no spaces in "list 2" items. This way you can.

def match(l1, l2):
    result = []
    string = ' '.join(l2) + ' '
    for i in l1:
        index = string.find(i)
        if index != -1:
            result.append(string[index + len(i) + 1:string.find(' ', index + len(i) + 1)])
    return result
print(match(items, split_t))

Output:

['20.02.2020', '420551901501', 'SN0000000019', '17.02.2020', '14,500.4667', '420551901501', 'SONATEL']

Upvotes: 1

Related Questions