Problem z metodą intersection

0

Mam drobny problem z metodą intersection. Napisałem poniższy kod:

def scramble(seq):
      return [seq[i:] + seq[:i] for i in range(len(seq))]

def tester(func, items, trace = True):
      for args in scramble(items):
            if trace: print(args)
            print(sorted(func(*args)))

Wywołanie:

tester(intersection, ('abc', 'abcde', 'bdef'))

I po wywołaniu pojawia się błąd, że nazwa 'intersection' jest niezdefiniowana. Co jest nie tak? Intersection jest funkcją wbudowaną więc nie trzeba jej importować. Zaznaczę, że pracuje na Pythonie 3.13

1

Intersection jest funkcją wbudowaną więc nie trzeba jej importować.

Możesz podać link do dokumentacji, gdzie ta funkcja jest zdefiniowana w Pythonie 3.13?

2

@dretred

Intersection jest funkcją wbudowaną więc nie trzeba jej importować

Jest, w pewnym sensie wbudowaną, ale jako metoda na zbiorze, set.
https://python-reference.readthedocs.io/en/latest/docs/sets/intersection.html

0

Wiem, że intersection w 3.13 działa na zbiorze set. Chodzi jednak o to jak bez większych modyfikacji tego kodu, z wykorzystaniem funkcji intersection zmodyfikować funkcję, którą napisałem w poscie żeby działała oczywiście. I czy da się to zrobić czy nie.

Lepiej jest odpowiadać w postach, a nie komentarzach. A co do meritum, to nie zadziała, bo intersection przyjmuje zbiory, czyli musiałbyś utworzyć zbiory z elementów scamble(seq), a są sobie równe.

0

@dretred Brakuje (przynajmniej mi) tej jasności czego oczekujesz i co chcesz uzyskać (być może cel da się osiągnąć za pomocą itertoolsów).
Natomiast samo intersection możesz stworzyć w oparciu o sygnaturę:

def intersection(*args):
  # logika - być może operująca na set()
  return ""

Co do logiki, to nie wiem co miałoby być efektem przecięciem argumentów, np. 'abc', 'abcde', 'bdef'. Zbiór pusty? (bo stringi są różne), podzbiory względem pozycji (np. pozycja 0: {a} {a} {b} -> przecięcie da zbiór pusty, pozycja 1 ... itd. ), a może chodzi o literki występujące w stringach? b jest wspólne dla tych 3 napisów (ale czy kolejność na której b występuje me znaczenie? np. 'ab' 'ba' mogą dawać przecięcie 'ab' (jeśli kolejność nieistotna) albo zbiór pusty (jeśli kolejność istotna)).

0

Jeszcze lepiej, to mają byc przecięcia tych scamble, czyli, np.:

In [35]: scramble("abcd")
Out[35]: ['abcd', 'bcda', 'cdab', 'dabc']

I teraz, co to? @dretred

0
lion137 napisał(a):

Jeszcze lepiej, to mają byc przecięcia tych scamble, czyli, np.:

In [35]: scramble("abcd")
Out[35]: ['abcd', 'bcda', 'cdab', 'dabc']

I teraz, co to? @dretred

No funkcja scramble właśnie to wykonuje jak można sprawdzić, a funkcja tester miała po prostu wyszukiwać części wspólne. Zadanie w zasadzie bez wiekszego sensu. To jest zadanie czysto edukacyjne i nie wykorzystuje go do rozwiązania palącego mnie problemu. Wiem, że funkcja, którą napisałem działa na starszych wersjach pythona od 3.3 w dół na pewno i po prostu jestem ciekawy czy wykorzystujac funkcję intersection z pythona 3.13 da sie osiągnąc ten sam efekt. Ale już rozumiem, że jest to niemożliwe. Dziękuje za pomoc.

0
yarel napisał(a):

@dretred Brakuje (przynajmniej mi) tej jasności czego oczekujesz i co chcesz uzyskać (być może cel da się osiągnąć za pomocą itertoolsów).
Natomiast samo intersection możesz stworzyć w oparciu o sygnaturę:

def intersection(*args):
  # logika - być może operująca na set()
  return ""

Co do logiki, to nie wiem co miałoby być efektem przecięciem argumentów, np. 'abc', 'abcde', 'bdef'. Zbiór pusty? (bo stringi są różne), podzbiory względem pozycji (np. pozycja 0: {a} {a} {b} -> przecięcie da zbiór pusty, pozycja 1 ... itd. ), a może chodzi o literki występujące w stringach? b jest wspólne dla tych 3 napisów (ale czy kolejność na której b występuje me znaczenie? np. 'ab' 'ba' mogą dawać przecięcie 'ab' (jeśli kolejność nieistotna) albo zbiór pusty (jeśli kolejność istotna)).

Chodziło po prostu o wyłapanie elementów wspólnych. Kolejność ustala funkcja scramble, a tester po prostu wyłapuje dodatkowo części wspólne. Jak napisałem już w jednej odpowiedzi zadanie czysto edukacyjne i ciekawy byłem czy jest prosty sposób wykorzystania funkcji intersection opartej o zbiór set w tym kodzie, który podałem ewentualnie delikatnie go modyfikując. Ale widzę, że jest to niemożliwe. Dziękuję.

0

A to da się, przy pomocy reduce z functools.

reduce(lambda x, y: x.intersection(y), <kolekcja zbiorów >)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.