【问题标题】:can someone help me make this Python code less ugly? Finding Facebook Friends on app, and not on app有人可以帮我让这个 Python 代码不那么难看吗?在应用程序上而不是在应用程序上查找 Facebook 好友
【发布时间】:2014-12-24 02:20:37
【问题描述】:
DEFAULT_CONNECTION_LEVEL = 10
# Up to a whole day
UPDATE_FRIENDS_EVERY_N_MINUTES = 360


def find_friends_on_app(friends):
    """
    Checks each facebook id to find which facebook friends
    use our app
    """
    facebook_ids = [friend["id"] for friend in friends]
    dt_friends = User.objects.filter(
        facebook_id__in=facebook_ids)
    friends_on_app = {friend.id: DEFAULT_CONNECTION_LEVEL for friend in
                  dt_friends}
    fb_id_on_app = {friend.facebook_id: "value" for friend in
                dt_friends}
    friends_not_on_app = \
        [{'Name': friend.get("name"),
          'id': friend.get("id")} for friend in friends if
         fb_id_on_app.get(friend.get("id")) is None]
    return friends_not_on_app, friends_on_app

代码获取用户的所有使用我们应用程序的 Facebook 好友,并返回一个字典,其中的键是他们在我们数据库中的 id,值是默认连接级别。

代码还应返回所有未使用我们应用的用户 Facebook 好友。

我使 fb_id_on_app 成为 facebook_id 的键的字典,以便我可以利用 O(1) 查找字典的时间。如果我将它设为一个列表,它将是一个 O(n),其中 n 是列表的大小,以检查值是否在其中。

我确定有更好的方法来做到这一点有什么想法吗?我们也在使用 django 框架。

【问题讨论】:

标签: python django facebook dictionary


【解决方案1】:

我只能看到很小的改进(尤其是在格式方面:-):

def find_friends_on_app(friends):
    friend_ids = User.objects.filter(facebook_id__in=[friend["id"] for friend in friends])
    friends_on_app = {friend.id: DEFAULT_CONNECTION_LEVEL for friend in friend_ids}
    fb_id_on_app = set(f.facebook_id for f in friend_ids)
    friends_not_on_app = [{'Name': friend.get("name"), 'id': friend.get("id")}
                          for friend in friends if friend.get('id') not in fb_id_on_app]
    return friends_not_on_app, friends_on_app

真的,丑陋取决于过度使用“朋友”和“id”这两个词及其变体——这使得在每一步都很难分辨friendxyz 是什么,以及它的@ 之间有什么区别987654323@,它的“.id”,它的“.facebook_id”......如果不深入了解我过度使用掩盖的预期语义,我无法解决这种丑陋!-)

【讨论】:

  • 嘿谢谢我做了你的改变。我喜欢你使用的集合,我没有意识到它们是具有虚拟值的字典,这基本上是我以前做过的。由于 Pep8,格式有点奇怪。
  • 是的,当我在十多年前实现set 的第一个版本时,它完全建立在dict 之上——现在它是优化的C 代码,而不仅仅是更具可读性(当合适)比dict,还节省了一些内存。顺便说一句,我不知道我在这里的任何地方都违反了 PEP 8...?
猜你喜欢
  • 2011-06-08
  • 2017-04-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多