【问题标题】:How to move Items from one list to the another list in python?如何在python中将项目从一个列表移动到另一个列表?
【发布时间】:2016-01-26 15:39:36
【问题描述】:

我想探索 10 个节点的每个可能的社区分配。我总共有 10 个项目:10 15 25 30 45 50 65 75 80 90 有两个列表(社区)c1c2 我将分配这些项目。最初,我将 10 个项目拆分如下:

c1 = [10, 45, 50, 75, 90] c2 = [15, 25, 30, 65, 80]

现在我想将一个项目移动到另一个列表,例如:

c1 = [45, 50, 75, 90] c2 = [10, 15, 25, 30, 65, 80]
c1 = [10, 45, 50, 75] c2 = [15, 25, 30, 65, 80, 90]
...

我还想移动两件、三件、四件(但不是五件)。喜欢,

c1 = [50, 75, 90] c2 = [10, 15, 25, 30, 45, 65, 80]
c1 = [10, 75, 90] c2 = [15, 25, 30, 45, 50, 65, 80]
...
c1 = [75, 90] c2 = [10, 15, 25, 30, 45, 50, 65, 80]
c1 = [10, 90] c2 = [15, 25, 30, 45, 50, 65, 75, 80]
...
c1 = [90] c2 = [10, 15, 25, 30, 45, 50, 65, 75, 80]
c1 = [45] c2 = [10, 15, 25, 30, 50, 65, 75, 80, 90]
...

我想将 1-4 项的所有可能迭代从 c1 移动到 c2。 (总共 31 种可能性:2^5-1)每个列表中的顺序无关紧要。我该怎么做?

我使用了以下代码。

c1 = [10, 45, 50, 75, 90]
c2 = [15, 25, 30, 65, 80]

for i in c1:
    c2.append(i)
    c1.remove(i)
    print c1, c2 

使用此代码,我只能得到以下结果。这段代码没有完成将一项移动到c2 的任务。我的代码没有尝试将多个项目移动到 c2

[45, 50, 75, 90] [15, 25, 30, 65, 80, 10]
[45, 75, 90] [15, 25, 30, 65, 80, 10, 50]
[45, 75] [15, 25, 30, 65, 80, 10, 50, 90]

如何才能顺利完成将物品移至c2的任务?通过这个任务,我可以将 10 个项目分配给两个列表(忽略案例c1==c2)。

【问题讨论】:

  • 提示:c1.remove(i) 不要修改您当前正在迭代的列表
  • 那么,您只将元素从c1 移动到c2,而不是其他方式,并且只从列表的前面或后面 移动连续的元素?
  • @tobias_k 不是相反:正确。但不仅是列表前面或后面的连续元素。我想要每一个可能的 1、2、3、4 项移动(总共 31 个)
  • 如果你从c1的中心取出一个元素,你把它放在c2的什么位置?您的示例在这里似乎有些不一致;还是没关系?另外,列表可以重复吗?

标签: python loops iteration


【解决方案1】:

试试:

c1.append(c2.pop(i))
c1.sort()

c2.append(c1.pop(i))
c2.sort()

地点:

  • i - 索引列表

【讨论】:

    【解决方案2】:

    如果您想创建 10 个项目到 2 个列表的所有可能分配,那么我会使用 itertools 包中的组合。例如:

    import itertools
    items = [10, 25, 45, 50, 15, 30, 65, 75, 80, 90]
    
    for m in xrange(len(items)+1):
        combinations = list(itertools.combinations(items, m))
        for c1 in combinations:
           c1 = list(c1)
           c2 = list(set(items) - set(c1))
           print c1, c2
    

    【讨论】:

      【解决方案3】:

      据我了解,您对算法更感兴趣,而不是简单地从一个列表附加到另一个列表。

      有一个标准库函数提供iterable 的组合。

      制作自己的combinations函数确实是一个很好的练习。

      快速而肮脏地解决您的问题:

      import itertools
      
      c1 = [10, 45, 50, 75, 90]
      c2 = [15, 25, 30, 65, 80]
      
      print c1, c2
      for i in range(1, 5):
          for c in itertools.combinations(c1, i):
              mc1 = sorted(list(set(c1).difference(set(c))))
              mc2 = sorted(list(set(c2).union(c)))
              print mc1, mc2
      

      【讨论】:

        【解决方案4】:

        以下内容会将项目从一个列表移动到另一个列表,而不会出现您在原始问题中遇到的错误迭代器位置问题:

        c1 = [10, 45, 50, 75, 90]
        c2 = [15, 25, 30, 65, 80]
        
        while c1:
            c2.append(c1[0])
            del c1[0]
            print (c1, c2)
        

        【讨论】:

          猜你喜欢
          • 2012-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-30
          • 1970-01-01
          相关资源
          最近更新 更多