簡體   English   中英

索引在python中沒有匹配項的列表

[英]indexing a list where there is no match in python

我有兩個單獨的列表(包含列表),這些列表可能具有重疊的值。 每個列表都有一個日期。 我想修改mylist1以便日期( item[3] )是mylist1中的日期和mylist2中相應日期之間的mylist2 我遇到的問題是,當沒有匹配項時,出現錯誤: IndexError: list index out of range 在這些情況下,我只希望不使用最小值,而只使用mylist1的日期。 我是否可以放入某種if錯誤子句?

我的代碼:

mylist1 = [[u'AAA', None, u'111', u'1/1/2015'],
           [u'BBB', None, u'222', u'1/1/2012'],
           [u'CCC', None, u'333', u'1/1/2012']]

mylist2 = [(u'111', u'1/1/2011'),
           (u'333', u'2013-11-10'),
           (u'444', u'1/1/2017')]

for key, item in enumerate(mylist1):
     mylist1[key] = [item[0], item[1], item[2],
                     min(item[3], [x for x in mylist2 if x[0] == item[2]][0][1])]

所需的輸出:

[[u'AAA', None, u'111', u'1/1/2011'],
 [u'BBB', None, u'222', u'1/1/2012'],
 [u'CCC', None, u'333', u'1/1/2012']]
mylist1 = [[u'AAA', None, u'111' ,u'1/1/2015'], [u'BBB', None, u'222' ,u'1/1/2012'], [u'CCC', None, u'333' ,u'1/1/2012']]
mylist2 = [(u'111', u'1/1/2011'), (u'333', u'2013-11-10'), (u'444', u'1/1/2017')]
for key, item in enumerate(mylist1):
    try:
         mylist1[key] = [item[0],item[1],item[2],min(item[3],[x for x in mylist2 if x[0] == item[2]][0][1])]
    except IndexError:
        #Put your codes that what you want to do if you got this error
        #print ("An error happened but I dont care") <--- like this for example
        pass #or just simply pass this error

實際上,您可以決定如果遇到IndexError會發生什么,請嘗試此操作。

如果我mylist2正確,則您的mylist2可以用作字典。 為什么不做一個:

mylist1 = [[u'AAA', None, u'111' ,u'1/1/2015'], [u'BBB', None, u'222' ,u'1/1/2012'], [u'CCC', None, u'333' ,u'1/1/2012']]
mylist2 = [(u'111', u'1/1/2011'), (u'333', u'2013-11-10'), (u'444', u'1/1/2017')]
# assuming, you are not responsible for the form of mylist2,
# we will change it into a dictionary here:
mydict = dict(mylist2)   # easy :)
for elem_list in mylist1:
    elem_list[3] = min(elem_list[3], mydict.get(elem_list[2], elem_list[3]))

elem_list是對列表的引用,因此我們不需要mylist1的索引,因為它的更改將持續存在。 這使最后一行的其余部分變得更容易,因為我們不必重新構建原始列表。 如果所需的元素不可用,則mydict.get可以防止錯誤。

如果您具有唯一鍵,這是一種很酷的方法:

# produce dictionaries whose keys are the matching values (have to be uniue)
mylist1dict={x[2]: x for x in mylist1}
mylist2dict={x[0]: x for x in mylist2}
# replace where needed, only use common keys
for k in set(mylist2dict) & set(mylist1dict):
    mylist1dict[k][2] = mylist2dict[k]
# this is the result
mylist1dict.values()

就像在某些情況下,您的min函數返回一個空列表一樣,您可以使用if語句檢查它,然后建立索引:

>>> for key, item in enumerate(mylist1):
...     m=min(item[3],[x for x in mylist2 if x[0] == item[2]])
...     if m :
...          mylist1[key] = [item[0],item[1],item[2],m[0][1]]
... 
>>> mylist1
[[u'AAA', None, u'111', u'1/1/2011'], 
 [u'BBB', None, u'222', u'1/1/2012'], 
 [u'CCC', None, u'333', u'1/1/2012']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM