2016-04-15 2 views
0

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

Элемент, заданный в функции (называемый элементом), может находиться в 0 или 1 позиции кортежа, но все кортежи в списке состоят всего из двух элементов.

pairs = [('a','b'),('c','d'),('e','f'),('c','a')] 

def connections(pairs, item): 
    output = '' 
    for j in pairs: 
     if item in j: 
      output = output + str(j) 
    return (output) 

В данный момент этот код вытаскивает весь набор (-ы), в котором есть элемент внутри них.

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

+0

Что такое * точный вывод, который вы ожидаете, и что вы сейчас получаете, что не соответствует вашим ожиданиям? – idjaw

+0

Я предполагаю, что вы ищете что-то, что эквивалентно 'reduce (лямбда-сумма, ток: total + current [1], pairs, ''") '? –

ответ

6

Это должно делать то, что вы хотите:

def connection(pairs, item): 
    return ''.join([p[1-p.index(item)] for p in pairs if item in p]) 

Вот некоторые пример вывода:

>>> connection([('a','b'),('c','d'),('e','f'),('c','a')], 'a') 
'bc' 
+0

Другие решения здесь прекрасны, но это самое читаемое решение. Хорошая работа! – mwm314

+0

Несколько быстрее альтернатива 'p [1-p.index (item)]' будет 'p [p [0] == item]'. – ShadowRanger

+0

@ShadowRanger Да, это тоже сработает. –

0

Вместо проверки членства проверьте равенство.

def connections(pairs, item): 
    output = '' 
    for j in pairs: 
     if item == j[0]: 
      output += j[1] 
     elif item == j[1]: 
      output += j[0] 
    return output 

Обратите внимание, что я упростил конкатенацию в дополненное задание и удаляюсь ненужные str() вызовов, так как они уже строка. Или вы могли бы сделать это следующим образом:

def connections(pairs, item): 
    return ''.join(j[0] if item==j[1] else j[1] if item==j[0] else '' for j in pairs) 
+0

Альтернативный оптимизированный подход к выбору:' (set (j) - {item }). pop() 'Это предполагает, что пары никогда не являются дублируемыми значениями. Может даже интегрировать его в цикл:' для j в map (set, pairs): '' if item in j: '' output + = (j - {item}). pop() '. Не собираюсь утверждать, что он более эффективен, красивее или чем-либо (если бы это было так, я бы сделал его ответом), просто предоставив MTOWTDI. :-) – ShadowRanger

+0

@ShadowRanger - set' не работает для повторяющихся пар (как вы упомянули), и это не сработает, если элемент не соответствует ни одному из элементов. – TigerhawkT3

+0

Вот почему он все еще нуждается в тесте членства, в котором я остался. , вы делаете вычитание сначала, поп, а затем проверяете, был ли этот набор опустошен этим: 'for j in map (set, pairs):', 'j - = {item}', 'other = j.pop() ',' если нет t j: output + = other' (который по-прежнему принимает пары, не имеет одинакового значения дважды, как и все решения на основе 'set'). – ShadowRanger

0
pairs = [('a','b'),('c','d'),('e','f'),('c','a')] 

def connections(pairs, item): 
    output = '' 
    for j in pairs: 
     if item in j: 
      index = 1-j.index(item) 
      output = output + str(j[index]) 
    return (output) 

print(connections(pairs, 'c')) 

Выход:

da 
+0

@ Kevin Guan: Спасибо за редактирование! – Sharad

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