您可以使用列表理解:
filtered = [e for i, e in enumerate(l) if not isDate(e) or (i > 0 and not isDate(l[i-1]))]
完整的示例:
l = ['2014-01-28', 'part002.csv.gz', '2014-01-28', 'part001.csv.gz', '2014-01-28', '2014-01-28', '2014-01-27', 'part002.csv.gz', '2014-01-25']
def isDate (s):
return '.' not in s
filtered = [e for i, e in enumerate(l) if not isDate(e) or (i > 0 and not isDate(l[i-1]))]
print (filtered)
解釋:
l
是我們最初的名單。
isDate
需要一個字符串,並測試它是否是一個日期(在我的簡單示例中,它只是檢查它不包含句點,爲了更好的結果使用正則表達式或strptime)。枚舉一個列表(或任何可迭代的,我現在將堅持單詞list
,只是爲了不太技術)。它返回一個元組列表;每個元組包含傳遞給枚舉的索引和元素。例如enumerate (['a', None, 3])
使得[(0,'a'),(1,None),(2,3)]
i, e =
解包元組,分配索引i
和元件到e
。
列表理解是這樣工作的(簡單化):[x for x in somewhere if cond(x)]
返回符合條件cond(x)
的所有somewhere
元素的列表。
在我們的例子中,我們只添加元素,我們的過濾名單,如果他們沒有時間(而不是水果)not isDate(e)
或者如果他們在開始時沒有i > 0
,並在同一時間他們的前身是不是日期not isDate(l[i-1])
(即是,一個文件)。
僞代碼:
Take list `l`
Let our filtered list be an empty list
For each item in `l` do
let `i` be the index of the item
let `e` be the item itself
if `e` is not a Date
or if `i` > 0 (i.e. it is not the first item)
and at the sametime the preceding item is a File
then and only then add `e` to our filtered list.
聖#$%^,這是不真實的.....你是男人。你想我女朋友的電話號碼嗎?認真。 –