Python l oop умножает элементы - PullRequest
2 голосов
/ 30 марта 2020

У меня очень простая проблема, и я действительно не понимаю, почему это происходит.

Я изучаю Python через кодовые войны на сайте. Один из вопросов - разделить предложение и упорядочить его по числу, содержащему каждое слово. Например, если предложение "Matias3 I1 a2m", программа должна вернуть "I1 a2m Matias3" из-за порядка чисел, содержащих каждое слово.

Это код, который я использую. Это очень просто, но когда я назначаю новый порядок y[p] = ..., программа умножает регистры. Если я уберу эту строку, регистры в порядке, и я не знаю почему.

sentence="is2 Thi1s T4est 3a" #Example of sentence
x=sentence.split(" ") #I create an array with all the words
y= x #I create a second array (y). This is the one I will order by the numbers of the words

for i in range(len(x)): #I make a loop for the array x
  print("i: "+str(i)) 
  for j in range(len(x[i])): #I make a look for each character of the word
    print(" i:"+str(i)+" j:"+str(j)+" "+x[i])
    if x[i][j:j+1].isnumeric(): #If the character is a number, then Id like to put that word in the 
                                #that number position in the y array (of course is the position-1)
      p=int(x[i][j:j+1])-1 # This is the position that the word should be
      y[p]=x[i]  # When I assing y[] to the correct position (I want that the position i                     
                 # becomes the position p, the program get lost)

print(y)

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Как уже отмечалось, y = x дает вам ссылку, а не копию того же списка. Вам нужно сделать y = x.copy(), чтобы получить требуемый результат.

Это поведение описано, например, в модуле копирования :

Операторы присваивания в Python не копируйте объекты, они создают привязки между целью и объектом. Для коллекций, которые являются изменяемыми или содержат изменяемые элементы, иногда требуется копия, чтобы можно было изменить одну копию, не изменяя другую.

Но кроме того, эта функция также дает вам результат:

print(sorted(sentence.split(), key=lambda e: min(e)))

Как видите, уже есть встроенная функция sorted(), которая делает все, что вы хотите. Все, что вам нужно сделать, это предоставить собственную функцию сортировки. Предоставленная функция сортировки ищет минимальное значение слов в предложении. Это делается с помощью встроенной функции min().

Чтобы выполнить задачу, необходимо сделать один последний шаг: снова распечатать список в виде строки. Это можно сделать с помощью str.join(), см .:

>>> sentence = "Matias3 I1 a2m"
>>> print(" ".join(sorted(sentence.split(), key=lambda e: min(e))))
I1 a2m Matias3
0 голосов
/ 30 марта 2020

То, что сказал @lain Shelvington, совершенно верно. Но вы можете попробовать немного кода ниже pythoni c.

sentence="is2 Thi1s T4est 3a"

raw_words_list = sentence.split(' ')
raw_words_dict = {}

for word in raw_words_list:
    for char in word:
        if char.isnumeric():
            raw_words_dict[char] = word

print([raw_words_dict[key] for key in sorted(raw_words_dict.keys())])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...