2014-02-04 3 views
0

Мой фактический результат выглядит следующим образом:Python: Изменение кортежа в списке

target = [([('Kid', '200-5'), (u'Rock', '200-6')], u's725')] 

Как я могу изменить данные в кортеже таким образом, что я могу вернуться, в конце концов, измененный список, который имеет тот же формат, цель?

Например: Я хотел бы изменить «kid» в «adult», так что остальное остается, т.е. я получаю: newTarget = [([('adult', '200-5'), (u 'Rock', '200-6')], u's725 ')]

Моя идея: Скопируйте все данные цели во временный список, измените настройки и создайте тот же формат, что и в целевом.

НО: Как я могу достичь этого конкретно? До сих пор я мог изменять и изменять вещи, но я не получил такой же формат ...

+1

что вы имеете в виду под «тот же формат»? btw, '[()]' такое же, как '[]' – zhangxaochen

+4

Я в замешательстве. Что вы здесь начинаете? Что вы пытаетесь изменить? –

+2

"[()] совпадает с []" - это правда. В общем, запятая - это то, что делает кортеж, а не parens. –

ответ

1

Поскольку кортежи неизменны, вы не можете изменять их элементы - вы должны заменить их новыми кортежами. Списки изменчивы, так что вы можете заменить отдельные части по мере необходимости:

>>> x = [(1, 2), (3, 4), 5] 
>>> x[0] = (x[0][0], 0) 
>>> x 
[(1, 0), (3, 4), 5] 

В приведенном выше примере, я создаю список x, содержащий кортежи в качестве первого и второго элементов и в междунар как его третий. Во второй строке я создаю новый кортеж для замены в первую позицию x, содержащий первый элемент старого кортежа, и новый элемент 0 для замены 2.

+0

Я понимаю ваш пример - я сделал то же самое. Но как бы вы справились с проблемой, что не знаете количество кортежей? Например, если у нас есть это: target = [([('Name', '200-5'), (u'Irgendwas ',' 200-6 ')], u's725'), ([('Nochwas ',' 250-5 '), (u'undsoweiter', '250-6')], u's985 ')] – MarkF6

+0

Если у вас есть переменное количество кортежей для замены, вам придется перебирать список либо по индексу для модификации на месте, либо по строительству нового списка, создавая новые кортежи для обмена по мере продвижения. Но ответ на то, что вы должны делать, очень зависит от структуры, которую вы ожидаете изменить и ее значения; невозможно вообще ответить на вопрос больше, чем я. – zigg

4

Вы пробовали это?

l = list(target[0][0][0]) 
l[0] = 'Adult' 
target[0][0][0] = tuple(l) 
+0

Как бы это выглядело с переменным количеством кортежей? – MarkF6

0

Вам понадобится рекурсии, если вам нужно быть более гибкими

target = [([('Kid', '200-5'), (u'Rock', '200-6')], u's725')] 

def search_and_replace(inlist): 
     res = [] 
     for t in inlist: 
      if isinstance(t, list): 
       res.append(search_and_replace(t)) 
      elif isinstance(t, tuple): 
       t1, t2 = t 
       if t1 == 'Kid': 
        t1 = 'adult' 
       elif isinstance(t1, list): 
        t1 = search_and_replace(t1) 
       res.append((t1, t2)) 
      else: 
       res.append(t) 

     return res 


print search_and_replace(target) 
+0

Я использовал вашу версию. Смотрите мой комментарий выше ... – MarkF6

+0

Прохладный! Рад, что вы сочтете это полезным. Не забудьте принять мой ответ! –

Смежные вопросы