私は次の2つのリストを持っています:
advanced_filtered_list_val1 = [row for row in cleaned_list if float(row[val1]) < wert1]
advanced_filtered_list_val2 = [row for row in cleaned_list if float(row[val2]) < wert2]
オプションおよび/またはまたはを使用して、フィルタリングされたリストをリストにマップするにはどうすればよいですか?
リスト内のデータは辞書であり、このリスト内のいくつかの行を検索してフィルタリングします。で2つの値をフィルタリングしたいと思います。これは正常に機能します。しかし、どうすればこれをマップしてリストでフィルタリングできますか?
私は次のことを試みました:
select = int(input())
#and operation
if select == 1:
mapped_list = [row for row in advanced_filtered_list_val1 and advanced_filtered_list_val2]
for x in mapped_list:
print(x)
#or operation
if select == 2:
mapped_list = [row for row in advanced_filtered_list_val1 or advanced_filtered_list_val2]
for x in mapped_list:
print(x)
次のようにデータをインポートします。
faelle = [{k: v for k, v in row.items()}
for row in csv.DictReader(csvfile, delimiter=";")]
からwert1
、wert2
およびから、wert1
またはからフィルタリングしますwert2
。つまり、and
句では両方のフィルタにある必要がtrue
あり、or
句ではまたはのいずれかであるwert1
必要がありますwert2
True
cleaned_list
2つのwert
類似条件(AND)または少なくとも1つ(OR)のいずれかを尊重する辞書をフィルタリングする必要があります。あなたにできることは
import operator as op
ineq_1 = 'gt'
ineq_2 = 'lt'
select = 2
andor = {
1:lambda L: filter(
lambda d: getattr(op,ineq_1)(float(d[val1]), wert1)
and getattr(op,ineq_2)(float(d[val2]), wert2),
L
),
2:lambda L: filter(
lambda d: getattr(op,ineq_1)(float(d[val1]), wert1)
or getattr(op,ineq_2)(float(d[val2]), wert2),
L
),
}
mapped_list = andor[select](cleaned_list)
for x in mapped_list:
print(dict(x))
可能な選択肢は、gt
(より大きい)、lt
(より小さい)、またはeq
です。
and_
と or_
python-builtinモジュール を使用することで、物事をもう少し「動的」にすることもできることに注意してください operator
。たとえば、
#Where the two following ix2-like stuffs are defined to make
# a correspondence between names one knows, and methods of the
# module operator.
ix2conj = {
1:'and_',
2:'or_',
}
ix2ineq = {
'<' :'lt',
'==':'eq',
'>' :'gt',
}
def my_filter(conjunction, inequality1, inequality2, my_cleaned_list):
return filter(
lambda d: getattr(op, ix2conj[conjunction])(
getattr(op, ix2ineq[inequality1])(float(d[val1]), wert1),
getattr(op, ix2ineq[inequality2])(float(d[val2]), wert2)
),
my_cleaned_list
)
ineq_1 = '>'
ineq_2 = '<'
select = 2
print(my_filter(select, ineq_1, ineq_2, cleaned_list))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加