簡體   English   中英

Python-按條件刪除列表中的特定對象

[英]Python - Remove specific object in list by condition

我有一類“ PushInfo”
並在列表中生成300個PushInfo對象
我想刪除列表中重復的用戶ID和IP

這是我的代碼:

from faker import Faker
import random

def RemovePustListDuplicateData(PushList):
    return  list(set([(x.userid, x.ip) for x in PushList]))

def FakeData(number):
  PushList = []
  fake = Faker()
  accountList = [('john','127.0.0.1'),('john','127.0.0.1'),('amy','127.0.0.1'),
                 ('lia','140.112.1.9'),('julia','140.112.1.9'),
                 ('asuka','140.112.1.9'),('roy','140.112.1.9'),('stacie','140.112.1.9'),('ben','123.964.123.41'),
                 ('yich','127.0.0.1'),('beef','127.0.0.1'),('aloha','235.151.123.1'),('yamaha','235.151.123.1')]
  for i in range(0,number):
      user = random.choice(accountList)
      PushList.append(PushInfo(fake.name(),
                                     user[0],
                                     fake.text(max_nb_chars=10),
                                     fake.date(pattern="%Y-%m-%d"),
                                     user[1]
                                     ))

  return PushList


class PushInfo:
    def __init__(self, name, userid, content, time,ip=''):
        self.name = name
        self.userid = userid
        self.content = content
        self.time = time
        self.ip = ip


PushList = FakeData(300)
print("top 10 push in list:")
for push in PushList[:10]:
  print("name:"+push.name+" id:"+push.userid+" content:"+push.content+" time:"+push.time+" ip:"+push.ip)

print("\nremove duplicate userid and ip  data")
print(RemovePustListDuplicateData(PushList))

https://repl.it/@YichLin/Remove-object-in-list/

示例代碼是返回元組列表

[(userid,ip),(userid,ip)....]

但是我想要的結果是

[PushInfo(some data),PushInfo(some data),.....]

如何取得這個結果?

嘗試這個:

from faker import Faker
import random

def RemovePustListDuplicateData(PushList):
    return  list(set(PushList))

def FakeData(number):
  PushList = []
  fake = Faker()
  accountList = [('john','127.0.0.1'),('john','127.0.0.1'),('amy','127.0.0.1'),
                 ('lia','140.112.1.9'),('julia','140.112.1.9'),
                 ('asuka','140.112.1.9'),('roy','140.112.1.9'),('stacie','140.112.1.9'),('ben','123.964.123.41'),
                 ('yich','127.0.0.1'),('beef','127.0.0.1'),('aloha','235.151.123.1'),('yamaha','235.151.123.1')]
  for i in range(0,number):
      user = random.choice(accountList)
      PushList.append(PushInfo(fake.name(),
                                     user[0],
                                     fake.text(max_nb_chars=10),
                                     fake.date(pattern="%Y-%m-%d"),
                                     user[1]
                                     ))

  return PushList


class PushInfo:
    def __init__(self, name, userid, content, time,ip=''):
        self.name = name
        self.userid = userid
        self.content = content
        self.time = time
        self.ip = ip

    def __eq__(self, other):
      return self.userid==other.userid and self.ip==other.ip

    def __hash__(self):
      return hash(('userid', self.userid, 'ip', self.ip))

    def __repr__(self):
      return str(self.userid) + ' ' + str(self.ip)


PushList = FakeData(300)
print("top 10 push in list:")
for push in PushList[:10]:
  print("name:"+push.name+" id:"+push.userid+" content:"+push.content+" time:"+push.time+" ip:"+push.ip)

print("\nremove duplicate userid and ip  data")
print(RemovePustListDuplicateData(PushList))

您需要實現eqhash方法,以檢查兩個對象是否相同。

更改RemovePustListDuplicateData(PushList)函數,如下所示:

def RemovePustListDuplicateData(PushList):
    object_memo = set()
    final_list = []
    for object in PushList:
        if (object.userid, object.ip) in object_memo:
            continue
        else:
            final_list.append(object)
            object_memo.add((object.userid, object.ip))
     return final_list

希望對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM