删除多个列表的值

时间:2019-11-27 14:36:48

标签: python list

我有一个python代码。我的主题是:

我有一篇法国天气文章。我提取了位置,我只想保留带有介词[“ de”,“à”,“ d”]的位置。

对于我的数据集的一篇文章,我出现了索引超出范围的错误。如果由我的本地化选择功能生成此错误。

def loc_selection(lieu, prep, lon, lat): 
    i=0
    while True:
        if prep[i] not in ["de", "à", "d'"]:
            lieu.pop(i)
            prep.pop(i)
            lon.pop(i)
            lat.pop(i)
            i = i - 1
        i = i + 1
        if i >= (len(prep)):
            break

    return lieu, prep, lon, lat

我有4个清单,分别是lieu,prep,lon,lat。我想删除不是正确介词的prep字段中的所有数据。我也想删除其他列表中的相应数据。

我不确定我的方法是最好的。随时应用您自己的方法。

谢谢您的帮助。

2 个答案:

答案 0 :(得分:1)

看起来zip一起整理列表并并行地对其进行迭代比较适合您要执行的操作。以下代码会产生带有以下前缀之一的(lieu, prep, long, lat)元组:

def loc_selector(lieus, preps, longs, lats, prefixes=("de", "à", "d'")):
    for lieu, prep, long, lat in zip(lieus, preps, longs, lats):
        if prep in prefixes:
            yield lieu, prep, long, lat 

然后,您可以在该生成器上再次使用zip来将它们重新放入列表:

lieus, preps, longs, lats = zip(*loc_selector(lieus, preps, longs, lats))

zip将在最短列表的末尾自动停止。

答案 1 :(得分:0)

假设您要从所有保持顺序的列表中删除元素。 frozensetset可以使用:

def remove_from_all(remove, *iterables):
    rem = set(remove)
    return (list(it - rem) for it in map(frozenset, iterables))

remove = [34, 18, 24]
lists = [1,3,18], [34, 13, 5], [64, 24, 10]
print(list(remove_from_all(remove, *lists)))

此打印:

[[1, 3], [13, 5], [64, 10]]

例如,我只是使用随机整数,因此您可以查看我的操作,因为您没有提供足够的输入细节。

注意:这也会删除重复项,因此您可以使用itertools.iterfalse来保留所有元素和顺序,而无需删除项目:

def remove_from_all(remove, *iterables):
    rem = set(remove).__contains__
    return (list(filterfalse(rem, it)) for it in iterables)
相关问题