0

私は辞書(リストを含む)と比較したいリストを持っています:

最初に調べたいのは[1, 1, 0, 0, 0, 1, 1, 1]、ref の各値リスト (例: issue1 の場合、値リストは ) が list と同じ長さであるかどうかabfです。

abf次に、注意が必要な部分があります。それらが同じ長さの場合、リスト内の各項目を の値リストの各項目と比較したいと考えていますref

しかし... ある条件下では、プログラムはref(現在の値リストの残りの項目をチェックせずに)次の値リストに移動する必要があります。これは、値リストの項目が1であり、対応するリストの項目abfは 0 です。

明確にするために、ここに一例を示します。

dict ref のキー 'issue1' の値リストは です。[1, 1, 0, 0, 0, 1, 1, 1].リストabf[1, 1, 0, 1, 0, 1, 0, 0]です。

ここで、これら 2 つのリストの各項目をチェックしたいと思います ( issue1 の値リストの最初の項目と list の最初の項目abf、次に の 2 番目の項目issue1と の 2 番目の項目などabf...):最初の 2 つの項目は 1 と 1 であり、条件 (上記を参照) が満たされない場合、次の 2 つの項目 (これもまた 1 と 1) に進みます。 7 番目の項目 (1 と 0)。この時点で、 value-list と list の比較を停止し、次の value-list (of ) とissue1listabfの比較を続行します。アイデアが得られることを願っています!issue2abf

これまでの私のコードは次のとおりです。

## ref is a dict with lists as values, abf is a list
ref = {'issue1': [1, 1, 0, 0, 0, 1, 1, 1], 
       'issue2': [1, 0, 0, 1, 0, 0, 0, 0], 
       'issue3': [0, 1, 0, 0, 1, 0, 0, 1]}
abf = [1, 1, 0, 1, 0, 1, 0, 0]

## getting the length of the lists in ref and abf ans save them in ref_total & abf_total
for key in ref:
    [int(item) for item in ref[key]]
ref_total = len(ref[key])
abf_total = len(abf)

## check whether ref_total and abf_total has same value
if ref_total == abf_total:
    for key, value in ref.items():
        for j in value:
            if (ref[key][j] == 1) and (abf[j] == 0): ## if item in ref is 1 and in abf is 0, go on to the next value-list
                break
            if j == abf_total-1: ## if he compared the whole value-list of the current key of ref with abf and the condition above did not occur, save the key of this value-list in resp!
                resp = ref[key]

else:
    resp = 'Length of strings varies!' ##if the lists don't have the same length

print resp ##let me know, which key "went through"

あなたの反応を本当に楽しみにしています。コードが機能せず、その理由がわかりません!

4

4 に答える 4

0

If I understand your requirement right, Python has that functionality built in. You can do this.

ref = {'issue1': [1, 1, 0, 0, 0, 1, 0, 1], 
       'issue2': [1, 0, 0, 1, 0, 0, 0, 0], 
       'issue3': [0, 1, 0, 0, 1, 0, 0, 1]}

abf = [1, 1, 0, 1, 0, 1, 1, 0]

abf == abf
# OUT: True


def findinref(d, abf):
    for key, value in ref.items():
        if value == abf:
            return value
    return None

findinref(ref, abf)

findinref(ref, [1,1,0,0,0,1,0,1])
# OUT: [1, 1, 0, 0, 0, 1, 0, 1]
于 2012-11-15T17:53:14.220 に答える
0

私が指摘したいあなたのコードにはいくつかの問題があります: -

for key in ref:
    [int(item) for item in ref[key]]

まず、上記のループはあいまいです。何もしていませんが、無視されるリストを作成するだけです

第二に、

ref_total = len(ref[key])
abf_total = len(abf)

上記の割り当ては、for ループの外側に配置したため、機能しません。インデントの問題。

if ref_total == abf_total:
    for key, value in ref.items():

上記のコード セグメントでは、if最初に条件を指定してからループを実行するのではなく、for ループにfor移動する必要があります。if conditionしたがって、各key, valueペアについて、len(value) == len(abf). true の場合、内側の for ループを続行します。

if (ref[key][j] == 1) and (abf[j] == 0)

abf[j] = 1この条件はとを考慮していませんref[key][j] = 0。不等式をチェックする代わりに、等式をチェックして、その否定を取ることができます。その方が簡単です。(編集: - その条件のみをチェックしたいだけであることに気付きました。したがって、この変更は無視できます)。

また、内側のループは であってはなりませんfor j in value。その時点でインデックスを作成することはできませんj。, を使用for j in range(ref_list)して、各インデックスの値を比較します。


上記の変更後にこのコードを試すことができます: -

ref = {'issue1': [1, 1, 0, 0, 0, 1, 1, 1], 
       'issue2': [1, 0, 0, 1, 0, 0, 0, 0], 
       'issue3': [0, 1, 0, 0, 1, 0, 0, 1],
       'issue4': [1, 1, 0, 1, 0, 1, 0, 0]}
abf = [1, 1, 0, 1, 0, 1, 0, 0]
abf_total = len(abf)  # Since it will never change. Move it outside

for key, value in ref.items():
    resp = ""
    ref_total = len(value)        

    if ref_total == abf_total:
        for j in range(ref_total):

            if not (value[j] == abf[j]): 
                break
            if j == abf_total-1: 
                resp = value
                print resp

    else:
        resp = 'Length of strings varies!' ##if the lists don't have the same length

出力 : -

[1, 1, 0, 1, 0, 1, 0, 0]
于 2012-11-15T17:42:45.057 に答える
0

コメントとしていくつかのメモを追加しましたが、これでうまくいくはずです:

## ref is a dict with lists as values, abf is a list
ref = {'issue1': [1, 1, 0, 0, 0, 1, 0, 1],
       'issue2': [1, 0, 0, 1, 0, 0, 0, 0],
       'issue3': [0, 1, 0, 0, 1, 0, 0, 1]}
abf = [1, 1, 0, 1, 0, 1, 1, 0]

# abf_total does not change during cycle. Calculate it outside.
abf_total = len(abf)

## getting the length of the lists in ref and abf ans save them in ref_total & abf_total
for key, items in ref.iteritems():
    ref_total = len(items)

    ## check whether ref_total and abf_total has same value
    if ref_total == abf_total:
        # Here 'ref' screened the outside ref. Use 'i'
        for i, value in enumerate(items):
            if (items[i] == 1) and (abf[i] == 0): ## if item in ref is 1 and in abf is 0, go on to the next value-list
                break
        if i == abf_total-1:
            # if he compared the whole value-list of the current key of ref with abf and the condition above did not occur, save the key of
this value-list in resp!
            resp = "%s = %s" % (key, items)
    else:
        resp = 'Length of strings varies!' ##if the lists don't have the same length

print resp ##let me know, which key "went through"

出力は次のとおりです。

issue2 = [1, 0, 0, 1, 0, 0, 0, 0]
于 2012-11-15T17:50:48.063 に答える
0

本当にありがとうございました。本当に素晴らしいです。こんなに反響があるとは思っていませんでした!! あなたは本当に私を助けてくれました。Rohit Jainのソリューションに行きました-Rohitに感謝します!! 完全なコードは次のとおりです (改善の余地がある場合は、私を批判することを躊躇しないでください! フィードバックをお待ちしております!!)

ref = {'issue1': [1, 1, 0, 0, 0, 1, 1, 1], 
       'issue2': [1, 0, 0, 1, 0, 0, 0, 0], 
       'issue3': [0, 1, 0, 0, 1, 0, 0, 1]}
abf = [1, 1, 0, 1, 0, 1, 0, 0]

abf_total = len(abf)

for key, value in ref.items():
    ref_total = len(ref[key])   
    if ref_total == abf_total:
        i = -1
        for j in value:
            i += 1
            if (j == 1) and (abf[i] == 0):
                break
            if i == len(abf)-1:
                resp = key
    else:
        resp = 'Length of strings varies!'
print resp
于 2012-11-17T15:42:25.293 に答える