我有一个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字段中的所有数据。我也想删除其他列表中的相应数据。
我不确定我的方法是最好的。随时应用您自己的方法。
谢谢您的帮助。
答案 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)
假设您要从所有保持顺序的列表中删除元素。 frozenset
和set
可以使用:
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)