Helena Rousseaux
Helena Rousseaux

Reputation: 39

Get the suffix from a list of similar string

# code to get commonprefix
    def commonprefix(m):
        if not m: return ''
        s1 = min(m)
        s2 = max(m)
        for i, c in enumerate(s1):
            if c != s2[i]:
                return s1[:i]
        return s1
#code to get the different suffix 
    strList = map(str, objList)
    strList = map(lambda x: x.replace('', ''), strList)  

# My code to get the different suffix of each element of a list 

    for i in range(len(liste)):

        Listelement = liste[i]["title"].tolist()
        common_name = commonprefix(Listelement)
        try:
            strList = map(str, Listelement) 
            strList = map(lambda x: x.replace(common_name, ''), strList)
            print(Listelement)
        except:
            pass

# this is how my "Listelement" variable look like

    ['Le Coton Coton Extra Doux Boîte 100pce - CHANEL']
    ['Allure Eau De Toilette Vaporisateur 50ml - CHANEL', 'Allure Eau De Toilette Vaporisateur 100ml - CHANEL']
    ['Allure Eau De Toilette Vaporisateur 50ml - CHANEL', 'Allure Eau De Toilette Vaporisateur 100ml - CHANEL']
    ['Eau De Cologne Les Exclusifs De Chanel 75ml - CHANEL', 'Eau De Cologne Les Exclusifs De Chanel 200ml - CHANEL']
    ['Eau De Cologne Les Exclusifs De Chanel 75ml - CHANEL', 'Eau De Cologne Les Exclusifs De Chanel 200ml - CHANEL']

Hi guys I have a small problem to find the suffix of my list of products. I got the common prefix function which give me for my list the correct answer but when i try to remove the common_prefix for each element of each list, it doesn't work, do you have any idea why? thank you so much

Upvotes: -1

Views: 1311

Answers (2)

milahu
milahu

Reputation: 3609

#!/usr/bin/env python3

# common prefix and common suffix of a list of strings
# https://stackoverflow.com/a/6719272/10440128
# https://codereview.stackexchange.com/a/145762/205605

import itertools

def all_equal(it):
    x0 = it[0]
    return all(x0 == x for x in it)

def common_prefix(strings):
    char_tuples = zip(*strings)
    prefix_tuples = itertools.takewhile(all_equal, char_tuples)
    return "".join(x[0] for x in prefix_tuples)

def common_suffix(strings):
    return common_prefix(map(reversed, strings))[::-1]

strings = ["aa1zz", "aaa2zzz", "aaaa3zzzz"]

assert common_prefix(strings) == "aa"
assert common_suffix(strings) == "zz"

Upvotes: 0

Bill Huang
Bill Huang

Reputation: 4658

  1. You need not reinvent the wheel for os.path.commonprefix.
  2. In addition, you can use slicing syntax on string instead of counting characters one-by-one.

Solution

import re
import os

ls = ['Allure Eau De Toilette Vaporisateur 50ml - CHANEL', 'Allure Eau De Toilette Vaporisateur 100ml - CHANEL']

# find common prefix
pfx = os.path.commonprefix(ls)
ans = [el[len(pfx):] for el in ls]
print(ans)  # ['50ml - CHANEL', '100ml - CHANEL']

Upvotes: 2

Related Questions