使用python对列表排序
这里我试图解决序列问题。我正在从输入做1:1模型混合序列。例如: [sw、cr、dw、sw] 这里我附上了我的代码。我有一只虫子。我找不到使用python对列表排序,python,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
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和7
我当前的输出是
1,2,3,4
5,8
谁能告诉我哪里出错了吗?不确定我是否正确理解了这个问题。老实说,您的代码没有太多意义
- 外部循环迭代
次,尽管它显然最多只能迭代max(max\u items)
次,假设每个组至少使用一次min(max\u items)
- 如果flag_sw | flag_dw | flag_cr==False:break条件只有在所有这些标志都为
False
- 在嵌套的
结构的每个块中,您从不同的组中获取三个项,而不仅仅是上面注释建议的一个项1)try/except
- 通过使用
、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']]
这是假设sw
、dw
和cr
中有足够的元素,并且不会过早地耗尽迭代器。如果可能是这种情况,您可以使用例如next(icr,None)
,然后从结果中过滤出None
元素,但在这种情况下代码的行为并不十分清楚
1) 如果我正确理解了那些嵌套的
try/except
,那么如果sw
为空,则您希望从cr
中获取下一项,其他项类似。在这种情况下,您可以通过定义一个helper函数,尝试从许多iter
对象中获取next
元素,从而使代码更加紧凑
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])
如果列表中的项目数不匹配,这也会起作用。当任何列表用尽时,程序应该如何运行?或者它保证总是有足够的元素?不。不能保证它有足够的元素,特别是在Python中,
是按位的“or”,而不是逻辑的“or”。这并不是说它在这里有多大区别,而是……而且,您使用exception是错误的。您不应该使用bare exception子句(始终指定您排除的确切异常),也不应该假设您得到的异常。您当前的代码将使所有异常静音,防止您检测到意外的异常。