Tłumaczenie Python'a na Ruby'ego

Tłumaczenie Python'a na Ruby'ego
MR
  • Rejestracja:około 14 lat
  • Ostatnio:około 10 lat
0

Cześć
Znalazłem taki kod:

Kopiuj
ret = ['']
letters = 'abcedfg'
ret = [prefix+letter for prefix in ret for letter in letters]

Napisany w Pythonie i próbuje go przetłumaczyć na Ruby'ego tak wygląda moj kod:

Kopiuj
ret = ['']
letters = "abded"
letters = letters.split(//)
for prefix in ret do
  for letter in letters do
    print ret << prefix + letter
  end
end

Ale moj problem polega na tym, że otrzymam pętlę nieskończoną. Nie wiem jak zrozumieć
to wyrażenie

Kopiuj
ret = [prefix+letter for prefix in ret for letter in letters]

.
Proszę bardzo o pomoc.

edytowany 1x, ostatnio: mrfustrr
unikalna_nazwa
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 10 lat
0

to pętla w pętli
dla każdego prefiksu w ret i litery w letters zwraca połączenie prefiksu z literą
u ciebie pewnie się tworzy nieskończona pętla bo zapisujesz w tym samym miejscu z którego pobierasz prefiksy i dochodzą ciągle nowe elementy a w pierwotnym kodzie najpierw nowe elementy zapisuje w jakimś "anonimowym" miejscu a potem dopiero przypisuje je do zmiennej "ret"
dodaj po prostu jeszcze jedną zmienną prefiksy a print daj na końcu


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 3x, ostatnio: unikalna_nazwa
MR
  • Rejestracja:około 14 lat
  • Ostatnio:około 10 lat
0

Dzięki pomoglo dodanie nowej tablicy a poźniej

Kopiuj
ret = ret | nowa_tablica
1

Python nie modyfikuje istniejącego ret, comprehension buduje kompletną nową listę. Spróbuj tak:

Kopiuj
ret = ret.flat_map do |prefix|
  letters.map do |letter|
    prefix + letter
  end
end
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:14 dni
1

Jeśli chcesz to napisać w "Ruby way" to piszesz:

Kopiuj
ret.map { |prefix| letters.split(//).map { |letter| prefix.to_s + letter } }.flatten

Powinno w rezultacie być tak jak [prefix+letter for prefix in ret for letter in letters].

Skoro nie rozumiesz młody padawanie to Ci wytłumaczę:

  • Array#map przeiterowuje przez wszystkie elementy w tablicy i zastępuje je wartością zwróconą przez blok
  • String#split dzieli ciąg w miejscu wystąpienia wyrażenia podanego jako argument, w tym przypadku dzieli na pojedyncze litery
  • Object#to_s zwraca ciąg znaków na bazie danego obiektu. Tutaj jest to potrzebne w razie gdy prefix jest nilem
  • Array#flatten zwraca spłaszczoną tablicę (wszystkie zagnieżdżone tablice zostają przepisane do nadrzędnej tablicy i usunięte)

edytowany 3x, ostatnio: hauleth
MR
Dzięki wygląda pięknie ale jestem początkującym Rubistą, i Twój kod jest dla mnie trochę zbyt skomplikowany.
hauleth
Już opisane młody padawanie.

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.