Home > Software design >  List of tuples (removing special items from tuple)
List of tuples (removing special items from tuple)

Time:04-04

I have list of tuples:

stack = [('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '0'),
 ('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '1'),
 ('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '1'),
 ('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '1'),
 ('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '1')]

It is necessary to remove digital strings from each tuple. So, final result should be as follows:

[('Гидротехническое оборудование','Гидравлическая турбина','Рабочее колесо','Кавитационный износ Механические повреждения Трещины на лопастях'),('Гидротехническое оборудование','Гидравлическая турбина','Рабочее колесо','Кавитационный износ Механические повреждения Трещины на лопастях'),('Гидротехническое оборудование','Гидравлическая турбина','Рабочее колесо','Кавитационный износ Механические повреждения Трещины на лопастях'),('Гидротехническое оборудование','Гидравлическая турбина','Рабочее колесо','Кавитационный износ Механические повреждения Трещины на лопастях'),('Гидротехническое оборудование','Гидравлическая турбина','Рабочее колесо','Кавитационный износ Механические повреждения Трещины на лопастях')]

The following code doesn't work:

final_list = [item for item in stack for x in item if x.isdigit() == False]

CodePudding user response:

You can filter out each string that isn't numeric using filter() and .isnumeric(), and then apply this to each tuple using a list comprehension:

result = [tuple(filter(lambda x: not x.isnumeric(), item)) for item in stack]

print(result)

You can also replace the list comprehension with list() and map():

result = list(map(lambda x: tuple(filter(lambda y: not y.isnumeric(), x)), stack))

print(result)

This outputs:

[('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях'),
 ('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях'),
 ('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях'),
 ('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях'),
 ('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях')

CodePudding user response:

Similar to @brokenbenchmark's solution, this comprehension generates a new list of tuples with only the wanted elements:

final_list = [tuple(x for x in t if not x.isnumeric()) for t in stack]
print(final_list)

Result:

[('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях'), ('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях'), ('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях'), ('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях'), ('Гидротехническое оборудование', 'Гидравлическая турбина', 'Рабочее колесо', 'Кавитационный износ Механические повреждения Трещины на лопастях')]

Comparing performance between @brokenbenchmark's solutions and the one given here:

from timeit import timeit

stack = [('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '0'),
 ('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '1'),
 ('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '1'),
 ('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '1'),
 ('Гидротехническое оборудование',
  'Гидравлическая турбина',
  'Рабочее колесо',
  'Кавитационный износ Механические повреждения Трещины на лопастях',
  '1')]


def bb1(xs):
    return [tuple(filter(lambda x: not x.isnumeric(), item)) for item in xs]


def bb2(xs):
    return list(map(lambda x: tuple(filter(lambda y: not y.isnumeric(), x)), stack))


def grismar(xs):
    return [tuple(x for x in t if not x.isnumeric()) for t in xs]


import itertools
import operator


def enke(xs):
    return [(*itertools.compress(tpl, map(operator.not_, map(str.isdigit, tpl))),) for tpl in xs]


print('bb1', timeit(lambda: bb1(stack)))
print('bb2', timeit(lambda: bb2(stack)))
print('grismar', timeit(lambda: grismar(stack)))
print('enke', timeit(lambda: enke(stack)))

Results:

bb1 3.1756196999995154
bb2 3.2160105999937514
grismar 2.9640408999985084
enke 3.0256607999981497

Another run (there's some variation, given the relative overhead here - a larger testset would be better):

bb1 3.059243999996397
bb2 3.4049178999994183
grismar 2.8236001999975997
enke 2.831016299998737

And another:

bb1 3.1364422000042396
bb2 3.156560700001137
grismar 2.996662400000787
enke 2.94375669999863

Very comparable, although I think either the simple comprehension or the implementation using itertools from user @enke wins out here. I would recommend trying both on a dataset that's more realistic.

If the performance is very similar in practice for you as well, I would pick the comprehension for its simplicity and the fact that it relies purely on basic Python, but performance may play into it.

  • Related