【问题标题】:Python: if element1 from list1 is equal to element2 from list2, change element1Python:如果 list1 中的 element1 等于 list2 中的 element2,则更改 element1
【发布时间】:2014-10-08 15:51:59
【问题描述】:

这是我在 UNI 的“编程基础”课程的家庭作业的一部分。 它说:

写下一个codes(lst,cods)函数,其中lstccccyyyymmgg中的一系列字符串(cccc是随机字符,yyyymmgg是日期),cods是一系列4个字符字符串。

函数应该像这样工作: 如果 lst 中的 'cccc' 等于 cods 中的字符串,则包含 cccc 的元素以 ['cccc', dd, mm, yyyy] 格式打印;否则以 ['ccccyyyymmdd'] 格式打印。

例如, 如果"AcDa20140930"lst 的元素并且"ACDA"cods 上, 然后列表lst中的元素"AcDa20140930"被替换为4个元素 "ACDA", 30, 9, 2014.

我试着这样解决它:

def codes(lst, cods):
    lst1=[]
    for element in lst:
        cccc = lst[0:3]
        yyyy = lst[4:7]
        mm = lst[8:9]
        dd = lst[10:11]
        for code in cods:
            if cccc == code:
                lst1 += cccc, dd, mm, yyyy
    return lst1

first = ['Cara20130716', 'Tara20080601', 'PALA19961231', 'Melo19601023']
secnd = ['PALA', 'CARA', 'Tara']
print codes(first, secnd)

[CODE MODIFIED]:现在输出是 [] 。 有什么想法吗?

【问题讨论】:

  • 您能否提供一个比“它不起作用” 更有意义的问题陈述?还有,那是真的给你的作业吗?好像写得不好。
  • 实际上...没有输出。当我使用 python program.py 执行程序时,shell 只显示光标,直到我中断,然后:^CTraceback(最近一次调用最后一次):文件“program.py”,第 38 行,在 打印代码(首先, secnd) 文件“program.py”,第 29 行,代码 lst.remove(element) KeyboardInterrupt -----我知道;写的不是很好,但是老师是这么写的。。
  • 你为什么不把print lst 扔到内部循环中看看发生了什么?另外,请注意,例如cccc = element[:4](查找“切片”)比您当前的方法要整洁得多。
  • 如果你的意思是这样 pastebin.com/NAHLjduA 输出是 ['Cara20130716', 'Tara20080601', 'PALA19961231', 'Melo19601023']
  • 所以它永远不会到达print lst?如果你把那条线移到循环中的其他地方怎么办?请注意,您在迭代列表时正在修改列表,这是一个臭名昭著的糟糕想法。

标签: python list element


【解决方案1】:

试试这个,它有效。

解决方案 #1:

repl.it[编辑]上的演示

代码:

def codes(lst, cods):

    toAdd = []
    c = 0
    for ind, elem in enumerate(lst):
        if elem[:4] not in cods:
            toAdd.append(elem + str(ind + c))
            lst.remove(elem)
            c += 1
    for ind, elem in enumerate(lst):
        tmp = []
        tmp.append(elem[:4])
        tmp.append(elem[10:])
        tmp.append(elem[8:10])
        tmp.append(elem[4:8])
        lst.insert(ind, tmp)
        lst.remove(elem)
    [lst.insert(int(elem[-1]), elem[:len(elem) - 1]) for elem in toAdd]

    return lst

first = ['Cara20130716', 'Tara20080601', 'PALA19961231', 'Melo19601023']
secnd = ['PALA', 'CARA', 'Tara']
print codes(first, secnd)

输出:

['Cara20130716', ['Tara', '01', '06', '2008'], ['PALA', '31', '12', '1996'], 'Melo19601023']

解决方案 #2:

如果您希望匹配不区分大小写。

repl.it 上的演示

代码:

def codes(lst, cods):

    for ind, cod in enumerate(cods):
        cods[ind] = cod.lower()
    toAdd = []
    c = 0
    for ind, elem in enumerate(lst):
        if elem[:4].lower() not in cods:
            toAdd.append(elem + str(ind+c))
            lst.remove(elem)
            c += 1
    for ind, elem in enumerate(lst):
        tmp = []
        tmp.append(elem[:4])
        tmp.append(elem[10:])
        tmp.append(elem[8:10])
        tmp.append(elem[4:8])
        lst.insert(ind, tmp)
        lst.remove(elem)
    [lst.insert(int(elem[-1]), elem[:len(elem) - 1]) for elem in toAdd]

    return lst

first = ['Cara20130716', 'Tara20080601', 'PALA19961231', 'Melo19601023']
secnd = ['PALA', 'CARA', 'Tara']
print codes(first, secnd)

输出:

[['Cara', '16', '07', '2013'], ['Tara', '01', '06', '2008'], ['PALA', '31', '12', '1996'], 'Melo19601023']

【讨论】:

  • 快到了。唯一缺少的东西:我也需要打印“第一”的其他元素。如果 elem 不在 cods 中,它应该在“第一”中打印它。所以输出应该是 [['Dear20130716'],['Pear','01','06','2008']...等]
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2020-06-09
  • 2023-01-26
  • 1970-01-01
相关资源
最近更新 更多