第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:根據(jù)條件拆分列表?

Python:根據(jù)條件拆分列表?

慕勒3428872 2019-07-03 16:04:23
Python:根據(jù)條件拆分列表?anims  = [f for f in files if f[2].lower() not in IMAGE_TYPES]從美學(xué)和性能角度來看,根據(jù)條件將項目列表拆分為多個列表的最佳方法是什么?相當(dāng)于:good = [x for x in mylist if x in goodvals]bad  = [x for x in mylist if x not in goodvals]有什么更優(yōu)雅的方法嗎?更新:下面是實際的用例,以更好地解釋我想要做的事情:# files looks like: [ ('file1.jpg', 33L, '.jpg'), ('file2.avi', 999L, '.avi'), ... ]IMAGE_TYPES = ('.jpg','.jpeg','.gif','.bmp','.png')images = [f for f in files if f[2].lower() in IMAGE_TYPES]anims  = [f for f in files if f[2].lower() not in IMAGE_TYPES]
查看完整描述

3 回答

?
慕慕森

TA貢獻(xiàn)1856條經(jīng)驗 獲得超17個贊

good = [x for x in mylist if x in goodvals]bad  = [x for x in mylist if x not in goodvals]

有什么更優(yōu)雅的方法嗎?

這段代碼可讀性很好,而且非常清晰!

# files looks like: [ ('file1.jpg', 33L, '.jpg'), ('file2.avi', 999L, '.avi'), ... ]
IMAGE_TYPES = ('.jpg','.jpeg','.gif','.bmp','.png')images = [f for f in files if f[2].lower() in IMAGE_TYPES]
anims  = [f for f in files if f[2].lower() not in IMAGE_TYPES]

再說一次,這是很好!

使用集合可能會有輕微的性能改進(jìn),但這是一個微小的差別,我發(fā)現(xiàn)列表理解要容易得多,您不必?fù)?dān)心順序被弄亂了,重復(fù)的內(nèi)容也會被刪除等等。

實際上,我可能會“倒退”另一步,只需使用一個簡單的for循環(huán):

images, anims = [], []for f in files:
    if f.lower() in IMAGE_TYPES:
        images.append(f)
    else:
        anims.append(f)

清單-理解或使用set()沒有問題,除非您需要添加其他檢查或其他邏輯-假設(shè)您想刪除所有0字節(jié)的jpeg,您只需添加以下內(nèi)容。

if f[1] == 0:
    continue


查看完整回答
反對 回復(fù) 2019-07-03
?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗 獲得超8個贊

good, bad = [], []for x in mylist:
    (bad, good)[x in goodvals].append(x)


查看完整回答
反對 回復(fù) 2019-07-03
?
UYOU

TA貢獻(xiàn)1878條經(jīng)驗 獲得超4個贊

以下是懶惰迭代器方法:

from itertools import teedef split_on_condition(seq, condition):
    l1, l2 = tee((condition(item), item) for item in seq)
    return (i for p, i in l1 if p), (i for p, i in l2 if not p)

它每項計算一次條件,并返回兩個生成器,首先從條件為真的序列中產(chǎn)生值,另一個生成條件為false的序列。

因為它很懶,所以您可以在任何迭代器上使用它,甚至是無限迭代器:

from itertools import count, islicedef is_prime(n):
    return n > 1 and all(n % i for i in xrange(2, n))primes, not_primes = split_on_condition(count(), is_prime)
    print("First 10 primes", list(islice(primes, 10)))print("First 10 non-primes", list(islice(not_primes, 10)))

通常情況下,非延遲列表返回方法更好:

def split_on_condition(seq, condition):
    a, b = [], []
    for item in seq:
        (a if condition(item) else b).append(item)
    return a, b

編輯:對于通過某些鍵將項拆分為不同列表的更具體的用法,下面是一個通用函數(shù):

DROP_VALUE = lambda _:_def split_by_key(seq, resultmapping, keyfunc, default=DROP_VALUE):
    """Split a sequence into lists based on a key function.

        seq - input sequence
        resultmapping - a dictionary that maps from target lists to keys that go to that list
        keyfunc - function to calculate the key of an input value
        default - the target where items that don't have a corresponding key go, by default they are dropped
    """
    result_lists = dict((key, []) for key in resultmapping)
    appenders = dict((key, result_lists[target].append) for target, keys in resultmapping.items() for key in keys)

    if default is not DROP_VALUE:
        result_lists.setdefault(default, [])
        default_action = result_lists[default].append    else:
        default_action = DROP_VALUE    for item in seq:
        appenders.get(keyfunc(item), default_action)(item)

    return result_lists

用法:

def file_extension(f):
    return f[2].lower()split_files = split_by_key(files, {'images': IMAGE_TYPES}, keyfunc=file_extension, default='anims')
    print split_files['images']print split_files['anims']


查看完整回答
反對 回復(fù) 2019-07-03
  • 3 回答
  • 0 關(guān)注
  • 2927 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號