【问题标题】:List combination challenge in Python 3 [closed]Python 3中的列表组合挑战[关闭]
【发布时间】:2020-05-29 10:46:00
【问题描述】:

我正面临一个棘手的挑战,即在 python 3 中进行列表组合。

我有一个列表需要用于组合。 (给定列表)

['01101001', '01110110', '01100101', '01101011']

我想将列表与下面的每个值结合起来。 (结果列表)

['00001111', '11110100', '10010110', '01011011']

结果列表中的第一项由给定列表中每个项的前4个字符串和后4个字符串依次组合而成。 所以0000 是每个项目的前 4 个字符串,1111 是给定列表中每个项目的后 4 个字符串。 因此结果列表的第一项是00001111

Python 3 编写的优化代码是什么? 提前谢谢!

【问题讨论】:

  • 除了看似试图将 Stack Overflow 用作代码编写服务之外,您的问题还不清楚。我看不出您的第二个列表是如何从第一个列表中得出的。你说了一些关于组合前 4 个字符串和后 4 个字符串的内容,但是你的列表只有 4 个字符串,所以“第二个 4 个字符串”没有明显的含义。您似乎在谈论字符串中的字符而不是字符串本身,但是'0000''1111 是从哪里来的?它们似乎与您的输入列表无关。即使我愿意,我也无法为您提供免费代码,因为问题太不清楚了。
  • 我的意思是每个项目的第二个字符串,列表有 4 个项目,所以我可以从每个项目中得到 4 个字符串。
  • 我解释的很详细,第一项的第一个字符串是0,第二项的第一个字符串是0,第三项的第一个字符串是0,第四项的第一个字符串item 在给定列表中为 0。因此,如果将它们组合在一起,则为 0000 并且第一项的第二个字符串是 1,第二项的第二个字符串是 1,第三项的第二个字符串是 1,第四项的第二个字符串是1 在给定的列表中。因此,如果将它们组合在一起,则为 1111
  • 我真的是python的新手。现在开始学习了。我不知道为什么@komatiraju 会这样提到。
  • Stack Overflow 旨在帮助程序员解决问题。您的问题是“Python 3 编写的优化代码是什么?” - 似乎您希望有人为您解决问题,而不是在解决问题时获得帮助。描述你解决问题的尝试会消除这种印象。如果您谈论字符串中的 characters 而不是字符串中的 strings,您的问题会更清楚。

标签: python arrays python-3.x list combinations


【解决方案1】:

惯用的 Python 代码大量使用迭代器。您正在尝试做的是对字符串进行并行迭代的一种形式,这是 zip 可以做的。

如果strings = ['01101001', '01110110', '01100101', '01101011']

然后[''.join(chars) for chars in zip(*strings)] 评估为

['0000', '1111', '1111', '0100', '1001', '0110', '0101', '1011']

这几乎就是你想要的。如果您可以成对地遍历列表,那就太好了。您可以通过多种方式执行此操作,包括使用 @mic_e 带来的 this nice 解决方案:

#the following pairwise iterator is due to mic_e
#from https://stackoverflow.com/a/30426000/4996248

def pairwise(it):
    it = iter(it)
    while True:
        try:
            yield next(it), next(it)
        except StopIteration:
            # no more elements in the iterator
            return

那么简单:

new_strings = [a+b for a,b in pairwise(''.join(chars) for chars in zip(*strings))]

这是['00001111', '11110100', '10010110', '01011011']

【讨论】:

  • 在这种情况下还有一种更简单的方法:t = list(zip(*k)) 将字符按顺序排列为元组,然后 s = [''.join(a+b) for a,b in zip(t[::2],t[1::2])] 将它们连接在一起。
【解决方案2】:

这是解决方案。

givenList = ['01101001', '01110110', '01100101', '01101011']
unitList = list()
result = list()

for i in range(8):
  for j in givenList:
    unitList.append(j[i])
  if i % 2 == 1:
    result.append(''.join(unitList))
    unitList = []

print(result)

这仅适用于包含静态 8 位数字的给定列表。 您可以将8 更新为len(givenList[0])

【讨论】:

    【解决方案3】:

    简单的解决方案

    lt = ['01101001', '01110110', '01100101', '01101011']
    
    def list_combination(lt,new=[],num=""):
      for i in range(len(lt[0])):
        if len(num)==8:
          num = ""
        for j in lt:
          num += j[i]
        if len(num)==len(lt[0]):
          new.append(num)
      return new
    print(list_combination(lt))
    #['00001111', '11110100', '10010110', '01011011']
    

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多