有没有通用的方法可以将项目添加到python2中的任何可迭代项目?

时间:2019-04-02 09:38:12

标签: python python-2.7

我试图以与类型无关的方式将项目添加到任何可迭代项中,但是并非所有python可迭代项似乎都具有标准的接口/方法。 列表使用append(),设置使用add(),等等。

基本上是这样-

Product

当前,我正在通过像so-

那样逐案处理单个类型来做
def add(anylist, item):
   # adds 'item' into 'anylist'
   # possibly return 'newlist' if 'anylist' is immutable (such as tuple, str)
   return newlist

x = add([1,2,3], 4) # x is now [1,2,3,4]
y = add('abcd', 'e') # y is now "abcde"
z = add((1,2,3), 4) # z is now (1,2,3,4)

这显然是次优的,因为它不适用于可迭代的情况。 我想念什么吗? 我试图利用python的concatenate(+)运算符来实现这一点,但这也无济于事。

>>> def add(anylist, item):
...   if isinstance(anylist, list):
...      anylist.append(item)
...   elif isinstance(anylist, set):
...      anylist.add(item)
...   elif isinstance(anylist, str):
...      anylist += item
...   elif isinstance(anylist, tuple):
...      anylist += (item,)
...   return anylist
... 
>>> print add([1,2,3], 4)
[1, 2, 3, 4]
>>> print add((1,2,3), 4)
(1, 2, 3, 4)
>>> print add("123", '4')
1234
>>> print add({1,2,3}, 4)
set([1, 2, 3, 4])

因为也没有简便的方法将'item'转换为可迭代的类型。

例如,以下内容-

>>> x = [1,2,3]
>>> x += [4]
>>> x
[1, 2, 3, 4]
>>> y = "123"
>>> y += "4"
>>> y
'1234'

有效,但是列表的行为不同-

item = '4'
x = '123'
x += str(item) # x = '1234' 

2 个答案:

答案 0 :(得分:1)

没有通用的方法来获取一个序列并自动创建一个具有一个额外项目的相同类型的另一序列。那是因为并非所有序列都允许任意值。例如,Python 3 range对象(或Python 2中的xrange)可以即时计算其值,因此无法添加您选择的新值。

但是,如果在将值添加到末尾后只对序列进行 iterate ,则可以使用itertools.chain获得所需的内容,该返回的内容为迭代器。

import itertools

def add(iterable, value):
    return itertools.chain(iterable, [value])

您将无法直接将迭代器传递给print语句,但也许可以使用其他类型的容器,例如列表来保存值,以便打印它们。

print list(add((1,2,3), 4)) # prints [1, 2, 3, 4], doesn't try to produce a tuple

答案 1 :(得分:1)

您可以通过在可迭代的类中重载运算符来实现此目的,但是付出的努力可能会超过收益。

无论如何,如果您想使用+来扩展列表,可以创建从列表继承的自己的容器类,并重载。__add__方法:

class my_list(list):
    def __add__(self, o):
        self.__getitem__(self).extend(o)

a = my_list()
a += [1] #a=[1]
a += [2] #a=[1,2]

类似地,您扩展所有可迭代项。 您提出的if-else方法可能更易于通过语言更新进行维护,因此如果您决定开始扩展内置类,则应牢记这一点。