1

基本的に、特定の条件に基づいて、リストの項目を 2 つの異なるリストに追加する方法を探しています。

私は、オンライン チャット インターフェイスを管理するかなり大規模な python 3.3 プログラムを持っています。たとえば['bob', 'joe', 'frank', 'jimmy', 'louis']、ユーザーのセット リストがある場合、ユーザーはオフラインまたはオフラインのいずれかです。すべてのオンライン ユーザーを 1 つのリストに追加し、オフライン ユーザーを別のリストに追加したいので、ボブとジョーがオンラインの場合、それらは「オンライン」リストに追加され、残りは「オフライン」リストに追加されます。 . その後、私は次のようなことをします:

print('online: %s offline: %s' % (', '.join(online), ', '.join(offline))

これを行う効率的な方法を教えていただければ、非常にありがたいです。

4

6 に答える 6

3

私の理解が正しければ、ユーザーの接続状態に応じて、入力リストを 2 つに分割する必要があります。ユーザーがオンラインかどうかを判断する関数があると仮定します。

users   = ['bob', 'joe', 'frank', 'jimmy', 'louis']
online  = [x for x in users if is_online(x)]
offline = [x for x in users if not is_online(x)]
于 2013-07-20T23:11:55.450 に答える
3

私はdefaultdict(list)あなたの基準に基づいて a を使用してそれに追加します-これはまた、ビジー/アウェイ/DNDなどにうまくスケーリングし、必要なステータスを介してそれにアクセスします:

from random import choice
from collections import defaultdict

status_choice = ['online', 'offline']
statuses = defaultdict(list)

for name in ['bob', 'joe', 'frank', 'jimmy', 'louis']:
    status = choice(status_choice)
    statuses[status].append(name)

print(statuses)
# defaultdict(<type 'list'>, {'offline': ['joe', 'frank', 'jimmy', 'louis'], 'online': ['bob']})
print(statuses['online'])
# ['bob']

名前の検索/削除/挿入を迅速に行うために、リストの代わりに aを使用することを検討することもsetできます。これにより、重複する値の発生も停止します。

于 2013-07-20T23:15:07.517 に答える
1

私は一度このようなものを使用しました:

def partition(seq, predicate, if_true, if_false):
    select = if_false, if_true
    for each in seq:
        select[predicate(each)](each)

def divisible_by_3(n):
    return n % 3 == 0

div3s = []
nondiv3s = []

partition(range(1, 11), divisible_by_3, div3s.append, nondiv3s.append)

print div3s, nondiv3s

結果:

[3, 6, 9] [1, 2, 4, 5, 7, 8, 10]
于 2013-07-21T02:54:00.380 に答える
1

あなたのアプリケーションがオンラインとオフラインのユーザーのリストをしばらく維持し、ユーザーがオンラインまたはオフラインになると内容が変化する場合、セットを使用するアプローチが最適だと思います:

online_users = set(initial_online_users)
offline_users = set(all_users) - online_users

def come_online(user):
    offline_users.remove(user)
    online_users.add(user)

def go_offline(user):
    online_users.remove(user)
    offline_users.add(user)

合計ユーザー数が多い場合でも、ユーザーをオンラインからオフラインに、またはその逆に移動する操作は非常に高速です。それぞれの追加と削除の順序は、不明なユーザーが渡された場合に例外が発生するように選択されています (ユーザーがどこにも追加されていません)。

于 2013-07-21T02:56:35.330 に答える
0

これが私の突き刺しです。

少し読みやすいですが、他の回答が示すように、それが好みであればさらに削減できます。

この例では、メイン リスト ( [["online1", "online2"], ["offline1", "offline2"]] ) 内の 2 つのリスト ( online/offline ) を返す関数 ( getUserStatus(user_list) ) を作成します。printUserStatus(user_status)に示されているように、対応するインデックス番号を使用して各リストにアクセスできます。printUserStatus (user_status)関数は、上記の例に基づいて 2 つのリストを文字列にフォーマットし、結果を返します。ユーザーがオンラインかオフラインかを確認するには、userIsOnline(name) 関数にロジックを入力する必要があります。userIsOnline (name)関数が機能するには、ブール値 ( True/False ) を返す必要があります。

使用例については、以下の例を参照してください。

online  = []
offline = []
users   = ['bob', 'joe', 'frank', 'jimmy', 'louis']

def userIsOnline(name):
    # your status check logic here
    return True #or False

def getUserStatus(user_list):
    for name in user_list:
        if userIsOnline(name):
            online.append(name)
        else:
            offline.append(name)
    return [online, offline]

def printUserStatus(user_status):
    on  = ', '.join(user_status[0])
    off = ', '.join(user_status[1])
    return 'online: %s offline: %s' % (on, off)

# Example usage
status = getUserStatus(users)
print(printUserStatus(status))
于 2013-07-21T00:45:37.937 に答える