在python2中,有没有一种通用的方法可以将项添加到任何iterable中?

在python2中,有没有一种通用的方法可以将项添加到任何iterable中?,python,python-2.7,Python,Python 2.7,我试图以一种与类型无关的方式将项添加到任何iterable中,但并非所有python iterable都有这样做的标准接口/方法。 列表使用append(),集合使用add()等 基本上是这样的- def add(anylist, item): # adds 'item' into 'anylist' # possibly return 'newlist' if 'anylist' is immutable (such as tuple, str) return newlist

我试图以一种与类型无关的方式将项添加到任何iterable中,但并非所有python iterable都有这样做的标准接口/方法。 列表使用append(),集合使用add()等

基本上是这样的-

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)
目前,我正在处理个别类型的个案基础上,这样做-

>>> 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])
这显然是次优的,因为它不适用于所有iterable。 我错过什么了吗? 我尝试使用python的concatenate(+)操作符来实现这一点,但这也没有帮助

>>> x = [1,2,3]
>>> x += [4]
>>> x
[1, 2, 3, 4]
>>> y = "123"
>>> y += "4"
>>> y
'1234'
因为也没有简单的方法将“item”转换为iterable类型

例如,以下内容-

item = '4'
x = '123'
x += str(item) # x = '1234' 
工作,但列表的行为方式不同-

>>> item = 4
>>> x = [1,2,3]
>>> x += list(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>项目=4
>>>x=[1,2,3]
>>>x+=列表(4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“int”对象不可编辑

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

但是,如果您只想在将值添加到末尾后对序列进行迭代,则可以使用返回迭代器的
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

没有通用的方法可以将一个序列自动创建另一个具有一个额外项的相同类型的序列。这是因为并非所有序列都允许任意值。例如,Python3
range
对象(或Python2中的
xrange
对象)会动态计算其值,因此无法添加您选择的新值

但是,如果您只想在将值添加到末尾后对序列进行迭代,则可以使用返回迭代器的
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

您可以通过在iterable类中重载运算符来实现这一点,但所做的努力可能超过了它的好处

在任何情况下,如果要使用+作为扩展列表的方式,可以创建自己的容器类继承自列表,并重载。
\uuuuu add\uuu
方法:

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]
类似地,您可以扩展所有的iterables。
您建议的if-else方法可能更容易通过语言更新维护,因此,如果您决定开始扩展内置类,那么请记住这一点。

您可以通过在iterable类中重载运算符来实现这一点,但所做的努力可能会超过其好处

在任何情况下,如果要使用+作为扩展列表的方式,可以创建自己的容器类继承自列表,并重载。
\uuuuu add\uuu
方法:

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]
类似地,您可以扩展所有的iterables。
您建议的if-else方法可能更容易通过语言更新进行维护,因此,如果您决定开始扩展内置类,请记住这一点。

@pistol2myhead,是的,这适用于列表,但是如何在不检查其类型的情况下将任何项转换为相应的iterable类型?例如,对于一个元组,这是如何工作的呢?您的意思是类似于
type(x)(itertools.chain(x[y])
。这适用于isinstance(x,(set,list,tuple))但不适用于
str
。您所说的“添加任何iterable”是什么意思?在每种情况下,加法的作用并不明显。那么
dict
对象呢?还是用户定义的容器/易趣?迭代器呢?你能约束吗?@DanD。也不是口述,而是一种自然的方式,比如说,一个generator@DanD. 谢谢你。这适用于列表、元组和集合,但不适用于str——正如您在评论中提到的。我想我现在可以单独处理str了。@pistol2myhead,是的,这适用于列表,但是如何在不检查其类型的情况下将任何项转换为相应的iterable类型呢?例如,对于一个元组,这是如何工作的呢?您的意思是类似于
type(x)(itertools.chain(x[y])
。这适用于isinstance(x,(set,list,tuple))但不适用于
str
。您所说的“添加任何iterable”是什么意思?在每种情况下,加法的作用并不明显。那么
dict
对象呢?还是用户定义的容器/易趣?迭代器呢?你能约束吗?@DanD。也不是口述,而是一种自然的方式,比如说,一个generator@DanD. 谢谢你。这适用于列表、元组和集合,但不适用于str——正如您在评论中提到的。我想我现在可以单独处理str了。