2015-11-30 2 views
0

так что я получил этот список объектов, которые выглядят что-то вроде:Python Получить строку в списке один из его атрибутов

[['String1', integer1], ['String2', integer2], ['String3', integer3], ['String4', integer4]] 

Я хотел бы получить «string1» на целое значение, без создания нового метода просто для этого. Есть ли элегантный способ сделать это?

+0

Если это ваша структура данных, нет. –

+3

Что произойдет, если две строки имеют одинаковое целочисленное значение? Если ответ «это никогда не произойдет», подумайте о переходе на словарь. – Kevin

+0

mmmm, что может случиться, я ожидал получить список со всеми строками :) –

ответ

1

Вы можете использовать список понимание:

>>> seq = [['String1', 4], ['String2', 8], ['String3', 15], ['String4', 8]] 
>>> result = [s for s, i in seq if i == 8] 
>>> print result 
['String2', 'String4'] 

С другой стороны, если у вас есть контроль над форматом вашей структуры данных, я предлагаю использовать словарь. Тогда получение строк легко:

>>> d = {8: ['String2', 'String4'], 4: ['String1'], 15: ['String3']} 
>>> print d[8] 
['String2', 'String4'] 

Получение данных в этот формат в первую очередь, это довольно просто, хотя я не думаю, что вы можете сделать это чисто в одной строке.

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> for s, i in seq: 
...  d[i].append(s) 
... 
>>> print d 
defaultdict(<type 'list'>, {8: ['String2', 'String4'], 4: ['String1'], 15: ['String3']}) 

Или

>>> d = {} 
>>> for s,i in seq: 
...  d.setdefault(i, []).append(s) 
... 
>>> print d 
{8: ['String2', 'String4'], 4: ['String1'], 15: ['String3']} 
+0

Спасибо! У меня есть контроль над форматом. –

0

С помощью словаря у вас есть гораздо больше гибкости.

a_dict = { 'string1' : 6, 
      'string2' : 76, 
      'string3' : 765,} 


for key in a_dict: 
    if(a_dict[key] == 76): 
     print('The number ' + str(a_dict[key]) + ' has a key name of ' + key) 

И вы также можете иметь список в качестве значений, если вам нужно.

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