2012-03-28 2 views
2

Прежде, чем я начну, пусть будет известно, что моему классу IS разрешено искать внешнюю помощь для этого задания при условии, что мы не копируем код напрямую. То, что я прошу, это help, а не откровенно нечестно полученный код. Я не собираюсь обманывать, задавая этот вопрос.Как связать списки, скаляры и векторы вместе в этом назначении Python?

Теперь, когда это прояснилось ....

Вот задание:

# 1: Написать функцию scalar_mult (s, v), которая принимает число, S, и список, v и возвращает скалярный кратный v на s.

Например:

def scalar_mult(s, v): 
    """  
    >>> scalar_mult(5, [1, 2])  
    [5, 10]  
    >>> scalar_mult(3, [1, 0, -1])  
    [3, 0, -3]  
    >>> scalar_mult(7, [3, 0, 5, 11, 2])  
    [21, 0, 35, 77, 14]  
    """ 

Я начал эту часть, и это то, что у меня есть:

import math 

s = input("Please enter a single number to be our scalar value: ") 
v = input("Please enter a vector value, like [1, 2] or [5, 6, 3], to be our vector value: ") 
#Note to self: TUPLES use the parentheses. LISTS use the brackets 

print "scalar_mult(", s, ",", + v, "is:" 
print v * s 

scalar_mult(s, v) 

Но я получаю сообщение об ошибке:

print "scalar_mult(", s, ",", + v, "is:" 
TypeError: bad operand type for unary +: 'list' 

Do вы понимаете, как это исправить?

А потом есть часть два ...

# 2: Написать функцию замены (s, старый, новый), который заменяет все вхождения старого с новым в строке s.

Например:

def replace(s, old, new):  
    """  
    >>> replace('Mississippi', 'i', 'I')  
    'MIssIssIppI'  
    >>> s = 'I love spom! Spom is my favorite food. Spom, spom, spom, yum!'  
    >>> replace(s, 'om', 'am')  
    'I love spam! Spam is my favorite food. Spam, spam, spam, yum!' 
    >>> replace(s, 'o', 'a')  
    'I lave spam! Spam is my favarite faad. Spam, spam, spam, yum!'  """ 
    """ 

Я еще не начал # 2, но я не очень понимаю, как подойти к нему. Любые идеи о том, как начать или как это работает?

Это должно быть в пятницу и назначено вчера. Просто FYI.

СПАСИБО ТАК НАЧАЛЬНО заранее всем, кто отвечает - я знаю, что это довольно большой вопрос, чтобы спросить>. <

Если вам нужно уточнить назначение, пожалуйста, скажите мне! Любая помощь была бы ВЕЛИКОЙ оценкой :)

+0

Ooh ... извините за плохое форматирование! Это мой первый вопрос, поэтому я не совсем уверен, как отформатировать код: p –

+0

Для вашей функции замены я настоятельно рекомендую вам ознакомиться с [документацией для встроенных строковых методов] (http://docs.python.org/ библиотека/stdtypes.html # строковой-метода). –

+0

Если вы отделите каждую строку на 4 пробела, она станет блоком кода. (Выбор текста и * затем * нажатие кнопки кода приведет к отступлению от этого текста.) – Amber

ответ

0

Первое, потому что Python строго типизирован, поэтому вы не можете добавлять произвольные типы вместе.

>>> '%d %r' % (1, [2, 3]) 
'1 [2, 3]' 

Для второго делегируйте заменяемый строковый метод.

0

То, чего вы пытаетесь достичь, невозможно в Python. Что вы можете сделать, это

>>> def scalar_mult(s, v): 
    return [s*x for x in v] 

>>> scalar_mult(5, [1, 2]) 
[5, 10] 
>>> 

Теперь то, что вы видите выше, называется пониманием списка. Вы также можете сделать то же самое с помощью карты, но, возможно, вы можете принять ее как упражнение.

Итак, если вы глубоко изучите код, вы перебираете все элементы и каждый элемент умножается на скалярное значение. Результат помещается в новый список, который вы понимаете.

Для второго вопроса вы должны, как правило, использовать библиотеку replace, но, похоже, вы не можете ее использовать. Таким образом, вы можете пройти через сам комментировал код

>>> def replace(st,old,new): 
    res=[] #As string is not mutable 
      #so start with a list to store the result 
    i=0 #you cannot change an index when using for with range 
      #so use a while with an external initialization 
    while i < len(st): #till the end of the string, len returns the string length 
     if st[i:i+len(old)]==old: #you can index a string as st[begin:end:stride] 
      res.append(new) #well if the string from current index of length 
          #equal to the old string matches the old string 
          #append the new string to the list 
      i+=len(old)  #update the index to pass beyond the old string 
     else: 
      res.append(st[i]) #just append the current character 
      i+=1    # Advance one character 
    return ''.join(res) #finally join all the list element and generate a string 
+0

Относительно части 1: ОП просит помощи в исправлении сообщения об ошибке и специально спросил _not_ для кода, который разрешит проблему домашнего задания для него. – dj18

+0

В вашем примере кода, для чего я выступаю? –

1

Для первой части вашего поста, ваше сообщение об ошибке из-за того, что вы используете оператор + с двумя операндами: а , (запятая) и v, который, по-видимому, является списком. Если вы просто хотите напечатать v, ваше print заявление должно выглядеть следующим образом:

print "scalar_mult(", s, ",", v, "is:" # Note that I removed the `+` 

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

>>> example_string = 'hello world!' 
>>> example_string[3] 
'l' 
>>> 

Я, конечно, не могу ответить на ваше домашнее задание для вас, но я бы определенно рекомендую взглянуть на Питон built-in types documentation. Это может помочь вам понять основные операции с строками, чтобы вы могли создать свою новую функцию. Надеюсь, это поможет вам немного :)