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 = 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
谁能告诉我哪里出错了?
解决方案
不确定我是否正确理解了这个问题。老实说,您的代码没有太大意义。
- 外部循环迭代
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']]
这是假设 中有足够的元素sw
,dw
并且cr
没有一个迭代器会过早耗尽。如果是这种情况,您可以使用 egnext(icr, None)
然后None
从结果中过滤掉元素,但在这种情况下代码的行为方式并不清楚。
1)如果我正确理解嵌套try/except
的内容,您想从cr
if获取下一个项目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])
如果列表中的项目数量不匹配,这也将起作用。
推荐阅读
- windows - 权限被拒绝尝试设置全局 git 配置
- oracle - Oracle SQL 多级数据透视组
- python - 如何在 FLASK 中检查 Python 请求是否存在
- python - Django 不对用户进行身份验证
- powershell - 我可以在最后没有换行符的powershell脚本中写警告吗?
- git - 无法克隆回购 - 没有这样的文件或目录 (tmp_pack_XXXXXX)
- docker - HTTP 请求在邮递员中工作,但不适用于 docker 容器中的 axios
- sql - 将数组列转换为 Presto 中的 K、V 对表
- database - 在 GridDB 中,可以反转索引/行键/搜索吗?
- javascript - 将道具传递给 ReferenceArrayField 似乎不起作用