首页 > 解决方案 > 使用python对列表进行排序

问题描述

在这里,我试图解决序列问题。我正在从输入中进行 1:1 模型混合序列。例子:

[sw,cr,dw,sw]

在这里,我附上了我的代码。我有一个错误。我找不到任何东西。

sw = ['1','4','5','8']
dw = ['3','7']
cr = ['2','6']

#sample output = ['sw 1','dw 1','c 1']
max_item = [len(sw),len(dw),len(cr)]
a=0
b=0
c=0
flag_sw = True
flag_dw = True
flag_cr = True
for i in range(max(max_item)):
  if (flag_sw)|(flag_dw)|(flag_cr)== False:
      break
  # Single Weld
  try:
      print(i,"i--swI #",sw[i+a])
      a +=1
  except:
      flag_sw = False
      print("--empty---swI #")
      try:
          print(i,"i---crI #",cr[i+c])
          c +=1
      except:
          try:
              print(i,"i---dwI #",dw[i+b])
              b +=1
          except:
              flag_dw = False
              print("---dw array Empty dwI #")
   # Ceramic
  try:
      print(i,"i---crII #",cr[i+c])
      c +=1
  except:
      flag_cr = False
      print("---empty crII #")
      try:
          print(i,"i---swII #",sw[i+a])
          a +=1
      except:
          print("--- empty SWII---")
          try:
              print(i,"i---dwII #",dw[i+b])
              b +=1
          except:
              flag_dw = False
              print("--- empty dwII---")
   # Double Weld
  try:
      print(i,"i--dwI3 #",dw[i+b])
      b +=1
  except:
      print(i,"i--empty---dwI3 #")
      b +=1
      try:
          print(i,"i---crI3 #",cr[i+c])
          c +=1
      except:
          try:
              print(i,"i---saI3 #", sw[i+a])
              a +=1              
          except:
              print("--empty-swI3 #")

  # Again Single Weld
  try:
      #if flag_sw & flag_dw == False:
      #  a +=1
      print(i,"i-- repeat swI4 #",sw[i+a])
  except:
      try:
        #if flag_sw & flag_dw == False:
        #  c +=1
        print(i,"i--repeat crI4 #",cr[i+c])
      except:
          try:
            #if flag_sw & flag_c == False:
            #  b +=1
              print(i,"i--repeat----dwI4 #",dw[i+b])
          except:
              print("---empty repeat dwI4 #")
  print(" -- cycle ending {}--".format(i))
  print("")

我正在尝试获得类似的输出

1,2,3,4
5,6,7,8

6 and 7但缺少序列。

我目前的输出是 1,2,3,4 5,8

谁能告诉我哪里出错了?

标签: python

解决方案


不确定我是否正确理解了这个问题。老实说,您的代码没有太大意义。

  • 外部循环迭代max(max_items)次数,虽然它显然只能在大多数min(max_items)时候迭代,假设每个组至少使用一次
  • 仅当所有这些标志都满足时,条件if flag_sw | flag_dw | flag_cr == False: break才会中断循环False
  • 在每个嵌套try/except结构块中,您从不同组中获取三个项目,而不仅仅是上面评论建议的一个1)
  • 通过采用sw[i+a],dw[i+b]cr[i+c]不是sw[a],dw[b]并且随着增加,cr[c]您一定会得到索引错误i

相反,您可以使用为不同的列表创建迭代器,iter然后next根据所需的模式从这些迭代器中获取元素。

>>> isw, idw, icr = map(iter, (sw, dw, cr))
>>> num = len(sw) // 2
>>> [[next(isw), next(icr), next(idw), next(isw)] for _ in range(num)]
[['1', '2', '3', '4'], ['5', '6', '7', '8']]

这是假设 中有足够的元素swdw并且cr没有一个迭代器会过早耗尽。如果是这种情况,您可以使用 egnext(icr, None)然后None从结果中过滤掉元素,但在这种情况下代码的行为方式并不清楚。


1)如果我正确理解嵌套try/except的内容,您想从crif获取下一个项目sw为空,其他项目类似。在这种情况下,您可以通过定义一个辅助函数来使您的代码更加紧凑,并尝试next从多个iter对象中获取元素。

def get_next(*iterators):
    for it in iterators:
        try:
            return next(it)
        except StopIteration:
            pass

isw, idw, icr = map(iter, (sw, dw, cr))
while True:
  a = get_next(isw, icr, idw)
  b = get_next(icr, isw, idw)
  c = get_next(idw, isw, icr)
  d = get_next(isw, icr, idw)
  if not any([a, b, c, d]):
      break
  print([x for x in (a, b, c, d) if x is not None])

如果列表中的项目数量不匹配,这也将起作用。


推荐阅读