【问题标题】:Running a elif statement in a for loop python在for循环python中运行elif语句
【发布时间】:2020-12-06 05:18:59
【问题描述】:

创建一个列表,在其中按列出的顺序检查和分配数字。说如果它的名称中有 COVER,那么它的 COVER 就没有别的了。如果 GLASS COVER 那么它是一个 COVER,但如果只有 GLASS 那么它的 GLASS 并且应该得到它的数字。我的问题是,如果列表有 GLASS COVER,我的列表“List_MainNum”会在其中获取两个值,对于 COVER 和 GLASS,当我希望它只分配 COVER 时,然后忽略进一步循环。我虽然 elif 语句会解决这个问题,但我错了

values = ['COVER','COVER','COVER','COVER','COVER','GLASS COVER','GLASS COVER','GLASS COVER','GLASS COVER','GLASS COVER'
,'SPRING', 'SPRING','SPRING','SPRING','GLASS COVER','COVER', 'SPRING GLASS' ,'TEST','TEST','TEST']
a = []
b = []
List_Main = []
List_MainNum = []
def sub(x,y):
    a.append(text)
    b.append(y)

Remain_List = []

labels = [['COVER', 'SPRING', 'GLASS',], [46,125, 33]] 


for text in values:
    for i in range(len(labels[1])):
        if i==0 and labels[0][0] in text:           
            List_Main.append(text)
            List_MainNum.append(labels[1][0])

        elif labels[0][i] in text:
            sub(labels[0][i], labels[1][i]) 

def Lizt(f,g):
    List_MainNum.extend(b)
    List_Main.extend(a)

Lizt(a,b)

for xyz in values:
    if xyz not in List_Main:
        Remain_List.append(xyz)

List_Main.extend(Remain_List)

print (List_Main)
print (b)

【问题讨论】:

  • 那么...您的代码有效吗?如果不是,它做错了什么?看起来您不是在这里要求算法
  • 不说我有 bc,那么我的最终名单有 bc 两次。一次是 b 的编号,一次是 c 的编号。我只想要b的号码
  • 这个问题可以通过在其中任何地方使用一致和清晰的名称来大大改善。您的文字介绍说有两个列表,但在实际代码中,我完全不知道六个不同列表中的哪一个对应于两者中的任何一个。变量名称不是不言自明的。代码做了很多从一个列表到另一个列表的附加值,但我无法弄清楚从哪里开始。我不知道代码中的输入或输出是什么,也不知道您在介绍中的示例输入中获得或期望什么输出。
  • 哦,对不起,我现在就编辑它
  • 我相信你可以看出我不是程序员。只是在大学里简单介绍了python。希望我的编辑有所帮助

标签: python arrays list for-loop if-statement


【解决方案1】:

不要一次只处理一个键(这需要标记已修复的值,而是尝试一次考虑一个值并找出哪个键首先匹配它们。后一个问题可以抽象为一个单独的函数:

import operator,functools

def non_prefix(it,f):
  """
  For how many elements of an iterable does a function yield false?
  """
  ret=0
  for x in it:
    if f(x): break
    ret+=1
  return ret

data=["abc","ab","c","a","ab","bc","e"]
keys=["a","b","c","d"]

print([non_prefix(keys,functools.partial(operator.contains,d)) for d in data])

这打印[0, 0, 2, 0, 0, 1, 4]; 4 表示没有匹配的键,因此您应该拒绝该值或使用任何默认值(可能通过使用比keys 长一个的labels 列表)。

【讨论】:

  • 似乎可行,我正在尝试创建一个包含所有数据值的列表,以及两个列表匹配的各自数字的列表
  • 我的数字列表也更复杂,例如对应于 [a,b,c,d] 的 [46, 52, 125, 3]
  • @ChrisBolig:无论是一个字符还是多个字符都不会影响字符串包含测试。我特意写了这个,以免详细依赖f 的运作方式。
  • 我正在尝试。我在返回正确的数值时遇到问题。喜欢封面-> 46
  • @ChrisBolig:我的建议是不要编辑通用函数——使用它返回的索引来选择像 46 这样的标签。因为它可能返回 len(keys),所以你需要 labels 比如果你使用labels[non_prefix(…)].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 2020-08-30
  • 1970-01-01
  • 2017-07-03
  • 2014-05-06
相关资源
最近更新 更多