【问题标题】:Insert a number of same new element in between the elements of a list in all possible ways in Python在 Python 中以所有可能的方式在列表的元素之间插入许多相同的新元素
【发布时间】:2017-09-16 15:42:35
【问题描述】:

我有一个列表mylist=[1,2],我想以所有可能的方式在列表的元素之间插入一个元素len(mylist)+1 的最大数量'A'。输出应该是这样的,

[1, 2]    

['A', 1, 2]
[1, 'A', 2]
[1, 2, 'A']

['A', 1,'A', 2]
['A',1, 2, 'A']
[1, 'A', 2,'A']

['A', 1,'A', 2, 'A']

到目前为止,我只能以所有可能的方式在列表中插入一个“A”。这是我的代码,

m = 3    
mylist = list(range(1,m))    
for j in range (len(mylist)+1):
    newlist = mylist[:j] + ['A'] + mylist[j:]
    print(newlist)

输出是,

['A', 1, 2]
[1, 'A', 2]
[1, 2, 'A']

当我必须在列表的元素之间插入两个“A”时,我陷入了下一步。需要帮助。

【问题讨论】:

  • 感谢您的建议。我已经编辑了问题。

标签: python python-3.x list numpy insert


【解决方案1】:

拿出你的清单,比如[1,2],并考虑元素之间的空格。由于我们的示例中有两个元素,因此有三个空格。让我们称他们为0, 1, 2。你想把你的信 'A' 放在这些空格里。虽然您没有这么说,但从您的示例中可以看出,每个空格最多只能输入一个字母,因此没有重复。

因此,您想要获取集合{0, 1, 2} 的所有可能子集。对于这些集合中的每一个,在该集合中的相应位置放置一个字母 'A'

所有子集的集合称为“幂集”。 Python 并没有完全内置,但是有几种方法可以得到它。这是使用itertools 内置模块的一种方式。

import itertools

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return itertools.chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

使用它来获取您的空间集,然后使用每个集将您的 'A's 插入到列表中。

如果您真的希望在输出中的列表组之间出现空白行,您可能更喜欢直接使用itertools.combinations(s, r) 函数——这会给出大小为r 的集合s 的所有子集。循环r 并打印结果列表,并在r 的每个值之后打印一个空行。鉴于您想要的特定输出,这可能是最好的选择。

获取powerset的另一种方法是使用FiniteSetsympypowerset()方法。 sympy 模块不是 Python 的标准部分,但如果您使用 Anaconda 安装方式安装了 Python,则您已经拥有它。

获得 powerset 的另一种方法是创建自己的递归或回溯例程。这是最困难的方法,但可以避免使用任何模块。

这是直接使用itertools.combinations 实现“最佳选项”的代码。我更改了您的变量以获得更好的名称和内容。

from itertools import combinations

mylistsize = 2
myinsertitem = 'A'
mylist = list(range(1, mylistsize+1))

allspaceplaces = list(range(mylistsize+1))
for numinserts in range (mylistsize + 2):
    if numinserts:
        print()
    for spaceplaces in combinations(allspaceplaces, numinserts):
        newlist = []
        lo = 0
        for hi in spaceplaces:
            newlist.extend(mylist[lo:hi])
            newlist.append(myinsertitem)
            lo = hi
        newlist.extend(mylist[lo:])
        print(newlist)

该代码的打印输出是

[1, 2]

['A', 1, 2]
[1, 'A', 2]
[1, 2, 'A']

['A', 1, 'A', 2]
['A', 1, 2, 'A']
[1, 'A', 2, 'A']

['A', 1, 'A', 2, 'A']

【讨论】:

  • 您已经很好地解释了,是的,我不需要那些空行。我也在尝试itertools,但无法达到目标。谢谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2023-02-14
相关资源
最近更新 更多