用于在两个列表中查找共享项的多次迭代

时间:2016-02-26 19:43:28

标签: python python-2.7 python-3.x

我有以下两个清单:

list1 = [(('diritti', 'umani'), 'diritto uomo'), (('sgomberi', 'forzati'), 'sgombero forza'), (('x', 'x'), 'x x'), ...] ## list of tuples, each tuple contains term and lemma of term

list2 = ['diritto uomo', 'sgombero forza'] ### a small list of lemmas of terms

任务是从list1中提取list2中存在引理的词汇。list2。请注意list1中的一个元素可以与list2中的多个字词共享引理,因此对于list1中的每个项目,我需要在result = [] for item in list2: for x in list1: for i, ii in x: if item.split()[0] in ii or item.split()[1] in ii : result.append(i) 中找到其共享项目。我试过这段代码:

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

public class OpponentItem {

    public int item_id ;
    public string item_type;
    public string item_name;
    public int item_star; 
    public int item_bonus;

    public OpponentItem() : base(){

    }

}

public class TestBug : MonoBehaviour {

    public List<OpponentItem> opponentList;
    private float barValue;
    public bool isDone;

    public static string[] collectItems =  new string[5]{

        "item_id=12",
        "item_type=Weapon",
        "item_name=Sword",
        "item_star=2",
        "item_bonus=10",

    };

    public string[] incomingData;

    public float progressBar {

        get{ 

            return barValue;

        }
        set{

            barValue = value;
            isDone = true;
        }

    }

    void Start () {

        isDone = false;

        string joined = System.String.Join("|", collectItems);
        incomingData = new string[5];
        incomingData[0] = joined;
        incomingData[1] = joined;
        incomingData[2] = joined;
        incomingData[3] = joined;
        incomingData[4] = joined;

        opponentList = new List<OpponentItem>();

        StartCoroutine(collectData<OpponentItem>(opponentList, incomingData, collectItems));

    }

    void Update(){

        if (isDone){

            isDone = false;
            Debug.Log(opponentList[1].item_id);

        }
    }

    public IEnumerator collectData<T>(List<T> list, string[] tempArray, string[] queryArray) where T : new() {

        list =  new List<T>(tempArray.Length);

        for(int h = 0; h < tempArray.Length ; h++){

            list.Add(new T()); 

            string[] mybox = new string[queryArray.Length]; 
            mybox = tempArray[h].Split('|');

            for (int k = 0; k < queryArray.Length ; k++){

                string[] inbox = new string[2];
                inbox = mybox[k].Split('=');

                if (list[h].GetType().GetField(inbox[0]).FieldType.FullName == "System.Int32"){

                    list[h].GetType().GetField(inbox[0]).SetValue(list[h], Int32.Parse(inbox[1]));
                    Debug.Log(list[h].GetType().GetField(inbox[0]).GetValue(list[h]));

                }
                else if(list[h].GetType().GetField(inbox[0]).FieldType.FullName == "System.Single"){

                    list[h].GetType().GetField(inbox[0]).SetValue(list[h], Single.Parse(inbox[1]));
                    Debug.Log(list[h].GetType().GetField(inbox[0]).GetValue(list[h]));
                }
                else{

                    list[h].GetType().GetField(inbox[0]).SetValue(list[h], inbox[1]);
                    Debug.Log(list[h].GetType().GetField(inbox[0]).GetValue(list[h]));
                }

            }

        }

        yield return new WaitForSeconds(0.2f);
        progressBar += 0.5f; 
    }


}

此代码需要很长时间才能完成任务,有人可以提出另一种方法来执行此操作。感谢

1 个答案:

答案 0 :(得分:2)

如果您只想匹配相同的词条,则不需要拆分单词并检查成员资格,只需在列表解析中使用==操作即可:

>>> [item for item, lemm in list1 for w in list2 if w == lemm]
[('diritti', 'umani'), ('sgomberi', 'forzati')]

否则通过在list1的引理中分割引理和成员资格检查,它不会给你任何结果。