迭代列表中的命名元组

时间:2015-07-06 00:03:04

标签: function python-3.x tuples

我试图从列表中的namedtuple中检索值。它需要一个参数,一个namedtuple或一个namedtuples列表,并返回price字段中的值。这是我的代码:

def price(rlist):
    for item in rlist:
        return item.price

RC = [
Restaurant("Thai Dishes", "Thai", "334-4433", "Mee Krob", 12.50),
Restaurant("Nobu", "Japanese", "335-4433", "Natto Temaki", 5.50)]

print(price(RC))

它应该打印12.50和5.50 ..但它只打印12.50。如何改进或更正迭代?

Book = namedtuple('Book', 'title author year price')

favorite = Book('Adventures of Sherlock Holmes', 'Arthur Conan Doyle', 1892, 21.50)

然后当我这样做时:

 price(favorite)

它给了我一个错误:

for item in rlist:
TypeError: 'type' object is not iterable

2 个答案:

答案 0 :(得分:2)

也许使用

def price(rlist):
    return [item.price for item in rlist]

返回您想要的内容

答案 1 :(得分:0)

您可以list comprehension使用string.join方法。

>>> from collections import namedtuple
>>> Restaurant = namedtuple('Restaurant', 'name cuisine phone dish price')
>>> RC = [Restaurant("Thai Dishes", "Thai", "334-4433", "Mee Krob", 12.50), Restaurant("Nobu", "Japanese", "335-4433", "Natto Temaki", 5.50)]
>>> def price(a_tuple):
...     return ', '.join([str(rc.price) for rc in a_tuple])
... 
>>> price(RC)
'12.5, 5.5'

方法join返回一个包含iterable元素的字符串。

要解决只有一个namedtuple(而不是它们的列表)的问题,你可以检查参数是否有一个属性_fields(namedtuples有这个属性)

>>> def price(a_tuple):
...     if hasattr(a_tuple, '_fields'):
...         return a_tuple.price
...     return ', '.join([str(rc.price) for rc in a_tuple])
... 
>>> price(RC)
'12.5, 5.5'
>>> price(RC[0])
12.5

此解决方案使用任何可迭代类型(列表,元组,迭代器等)