簡體   English   中英

用 2 個列表的字符串匹配子字符串

[英]Matching substrings wíth strings of 2 lists

當我遇到問題時,我正在嘗試編寫工作代碼。 我的目標是找到位於特定地區的企業。 我有兩個清單。 第一個列表的項目看起來像這個“City Count Businessname”,包含我們縣的所有城市,而第二個列表的項目看起來像這個“City”,包含我們區的所有城市。 我想比較這些列表,以便得到我們地區的所有企業,結果像這樣的“城市計數企業名稱”。

那是我的代碼:

jVal = "|".join(A) print([i for i in B if i in jVal ])

我也試過這個:

for item1 in A:
for item2 in B:
    if item1 == item2:
        print(item1)

兩者都不起作用,我要么根本沒有得到任何結果,要么結果得到了整個“A”。 任何幫助將不勝感激!

您錯過了內部for循環的縮進

for item1 in A:
  for item2 in B:
    if item1 == item2:
        print(item1)

或者,如果兩個列表中的值都是單個單詞,則可以使用set執行此操作

list(set(A).intersection(set(B)))

從你的問題來看,它是列表中單詞的組合

businesses = ["C1 count B1", "C2 count B2", "C1 count B3"]
cities = ["C1","C3","C4"]

for city in cities:
  for business in businesses:
    if city in business.split():
      print(city, business)

根據我對您的列表內容的了解,您可以使用以下內容:

businesses = ["C1 count B1", "C2 count B2", "C1 count B3"]
cities = ["C1","C3","C4"]

output = [a for a in businesses if a.split()[0] in cities]
print(output)

假設空格將第一個列表中每個項目的組件分開,這將產生:

['C1 count B1', 'C1 count B3']

抱歉,這里是您需要的代碼(舊版本因換行符“\\n”而無法正常工作):

def pt(x):
    with open(x+".txt","r",encoding="utf-8") as f:
        return f.read().splitlines()

b=pt("Businesses")
c=pt("Cities")

arr=[i for i in b if any(item in i.split() for item in c)]
for local_city in list_of_cities_in_our_district:
  for entry in list_of_city_county_business:
    if entry's city matches local_city:
        print the business name

這是一些應該做你想做的偽代碼......我把語義細節留給你,用於解析列表的布局等。

完整的解決方案,由於非結構化數據需要大量格式化

with open("Businesses.txt", mode='r') as f:
    listBusinesses = f.readlines()
with open("Cities.txt", mode='r') as f:
        listCities = f.readlines()

Cities = []
for values in listCities:
    if len(values.split('\n')[0]) > 0:
        Cities.append(values.split('\n')[0])

CityNames = []
BusinessNames = []
SerialNo = []

for values in listBusinesses:
    if len(values.split('\n')[0]) > 0:

        vCityNames = values.split('\n')[0][:26].strip()
        CityNames.append(vCityNames)

        vSerialWithBusiness = values.split('\n')[0][26:].strip()
        if len(vSerialWithBusiness.split('\n')[0].split('.')) > 1:
            vSerialNo = (vSerialWithBusiness.split('\n')[0].split('.')[0].strip())
            SerialNo.append(vSerialNo)
            vBusinessNames = (vSerialWithBusiness.split('\n')[0].split('.')[1].strip())
        else:
            vBusinessNames = (vSerialWithBusiness.split('\n')[0].split('.')[0].strip())
            SerialNo.append('Missing')
        BusinessNames.append(vBusinessNames)

assert len(CityNames) == len(SerialNo) == len(BusinessNames)

count = 0
for x  in range(len(Cities)):
    for y in range(len(CityNames)):
        if Cities[x] == CityNames[y]:
            count = count + 1
        print(Cities[x].ljust(27,' ') ,SerialNo[y].ljust(7,' '), BusinessNames[y])

# Total Businesses 3488,  matching Cities 345

鑒於提供的數據文件中的數據格式不完美,以下代碼可能會更好。 它還有一個額外的優勢,即按照城市在城市出現在城市 txt 文件中的順序按城市對結果進行分組。

with open('Cities.txt', encoding='utf-8') as f: cities = f.read().split('\n')
cities = [x.strip() for x in cities if x]

with open('Businesses.txt', encoding='utf-8') as f: businesses = f.read().split('\n')
businesses = [x for x in businesses if x]

found = 0
for c in cities:
    for b in businesses:
        if b.startswith(c):
            found += 1
            print(b)

print(f'Found {found} businesses')

給定您的數據文件,以下內容可以解決問題。 該代碼假設企業文件在每行的前 27 個字符內包含城市名稱(有些行實際上缺少城市!)。

該代碼還過濾掉了數據文件中的一些空行。

with open('Cities.txt', encoding='utf-8') as f: cities = f.read().split('\n')
cities = [x.lower() for x in cities if x]

with open('Businesses.txt', encoding='utf-8') as f: businesses = f.read().split('\n')
businesses = [x for x in businesses if x]

for b in businesses:
    if b[:27].strip().lower() in cities: print(b)

暫無
暫無

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

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