Python字典筛选仅返回第一个有效出现。

huangapple go评论118阅读模式
英文:

Python dictionary filter only returning first valid occurrence

问题

I'm implementing filter functionality for a dictionary.

  1. class Filter:
  2. def __init__(self, obj):
  3. self.obj = obj
  4. def isin(self, key, lst):
  5. self.obj = {k:[v[i] for i in range(len(self.obj)+1) if self.obj[key][i] in lst]
  6. for k,v in self.obj.items()}
  7. def gt_x(self,key,value):
  8. self.obj = {k:[v[i] for i in range(len(self.obj)+1) if self.obj[key][i] > value]
  9. for k,v in self.obj.items()}

The interesting thing I've noted is that it only returns the first occurrence which meets filter requirements.

  1. d = {'a':[1,1,2,2,3,3],
  2. 'b':[3,3,2,2,1,1,]}
  3. f = Filter(d)
  4. f.isin(key='a',lst=[2,3])
  5. f.obj
  6. # desired: {'a': [2,2,3,3], 'b': [2,2,1,1]}

And

  1. d = {'a':[1,1,2,2,3,3],
  2. 'b':[3,3,2,2,1,1,]}
  3. f = Filter(d)
  4. f.gt_x('a', value=1)
  5. f.obj
  6. # desired: {'a': [2,2,3,3], 'b': [2,2,1,1]}

I know that in practicality I could do this functionality in Pandas or other data libraries. But this is more of a curiosity now than anything else. Why are these class methods only returning the first valid occurrence?

英文:

I'm implementing filter functionality for a dictionary.

  1. class Filter:
  2. def __init__(self, obj):
  3. self.obj = obj
  4. def isin(self, key, lst):
  5. self.obj = {k:[v[i] for i in range(len(self.obj)+1) if self.obj[key][i] in lst]
  6. for k,v in self.obj.items()}
  7. def gt_x(self,key,value):
  8. self.obj = {k:[v[i] for i in range(len(self.obj)+1) if self.obj[key][i] > value]
  9. for k,v in self.obj.items()}

The interesting thing I've noted is that it only returns the first occurrence which meets filter requirements.

  1. d = {'a':[1,1,2,2,3,3],
  2. 'b':[3,3,2,2,1,1,]}
  3. f = Filter(d)
  4. f.isin(key='a',lst=[2,3])
  5. f.obj
  6. >>> {'a': [2], 'b': [2]} # desired: {'a': [2,2,3,3], 'b': [2,2,1,1]}

And

  1. d = {'a':[1,1,2,2,3,3],
  2. 'b':[3,3,2,2,1,1,]}
  3. f = Filter(d)
  4. f.gt_x('a', value=1)
  5. f.obj
  6. >>> {'a': [2], 'b': [2]} # desired: {'a': [2,2,3,3], 'b': [2,2,1,1]}

I know that in practicality I could do this functionality in Pandas or other data libraries. But this is more of a curiosity now than anything else. Why are these class methods only returning the first valid occurrence?

答案1

得分: 2

你必须将range(len(self.obj)+1)替换为range(len(self.obj[k])),因为第一个会得到len(keys) + 1,在你的示例中是3,我认为期望的行为应该是数组本身的长度。

  1. class Filter:
  2. def __init__(self, obj):
  3. self.obj = obj
  4. def isin(self, key, lst):
  5. self.obj = {k: [v[i] for i in range(len(self.obj[k])) if self.obj[key][i] in lst] for k, v in self.obj.items()}
  6. def gt_x(self, key, value):
  7. self.obj = {k: [v[i] for i in range(len(self.obj[k])) if self.obj[key][i] > value] for k, v in self.obj.items()}
  8. d = {
  9. "a": [1, 1, 2, 2, 3, 3],
  10. "b": [3, 3, 2, 2, 1, 1],
  11. }
  12. f = Filter(d)
  13. f.isin(key="a", lst=[2, 3])
  14. print(f.obj) # {'a': [2, 2, 3, 3], 'b': [2, 2, 1, 1]}
  15. d = {
  16. "a": [1, 1, 2, 2, 3, 3],
  17. "b": [3, 3, 2, 2, 1, 1],
  18. }
  19. f = Filter(d)
  20. f.gt_x("a", value=1)
  21. print(f.obj) # {'a': [2, 2, 3, 3], 'b': [2, 2, 1, 1]}
英文:

You have to replace range(len(self.obj)+1) to range(len(self.obj[k])) as 1st one gives you len(keys) + 1 which is 3 in your example, I think desired behaviour was len of array itself.

  1. class Filter:
  2. def __init__(self, obj):
  3. self.obj = obj
  4. def isin(self, key, lst):
  5. self.obj = {k: [v[i] for i in range(len(self.obj[k])) if self.obj[key][i] in lst] for k, v in self.obj.items()}
  6. def gt_x(self, key, value):
  7. self.obj = {k: [v[i] for i in range(len(self.obj[k])) if self.obj[key][i] > value] for k, v in self.obj.items()}
  8. d = {
  9. "a": [1, 1, 2, 2, 3, 3],
  10. "b": [3, 3, 2, 2, 1, 1],
  11. }
  12. f = Filter(d)
  13. f.isin(key="a", lst=[2, 3])
  14. print(f.obj) # {'a': [2, 2, 3, 3], 'b': [2, 2, 1, 1]}
  15. d = {
  16. "a": [1, 1, 2, 2, 3, 3],
  17. "b": [3, 3, 2, 2, 1, 1],
  18. }
  19. f = Filter(d)
  20. f.gt_x("a", value=1)
  21. print(f.obj) # {'a': [2, 2, 3, 3], 'b': [2, 2, 1, 1]}

huangapple
  • 本文由 发表于 2023年5月8日 00:42:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/76195132.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定