【问题标题】:How to multiply lists of words like vectors?如何乘以向量之类的单词列表?
【发布时间】:2018-10-06 04:49:43
【问题描述】:

我有这样的单词列表(这里只列出了 2 个):

list_1 = ['average', 'reasonable'] 
list_2 = ['fiddle', 'frolic']
list_n = ['etc', 'etc']

我希望将这两个列表相乘以获得这个答案:

obj[l1] * obj[l2] = ['average fiddle', 'average frolic', 'reasonable fiddle', 'reasnable frolic']
obj[l1] * obj[l2] *...* obj[n]

我写了这段代码:

import numpy as np
obj = {}
obj['l1'] = np.array(list_1)
obj['l2'] = np.array(list_2)
print(obj['l1']*obj['l2'])

但这只会给我一个错误:

TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('<U10') dtype('<U10') dtype('<U10')

我该怎么办?

编辑: 尝试使用以下用户建议的 itertools:

word_list = ['fair play']
output = {'fair': ['average', 'reasonable'], 'play': ['fiddle', 'frolic']}
result = []
for words in word_list: 
    for word in word_tokenize(words): 
        list_1 = output_set[word]
        result = [(x, y) for x, y in product(list_1, result)]
        result = list(map(' '.join, result))
print(result)

但这只会返回一个空集。有没有办法遍历“无限”列表?

【问题讨论】:

  • 不是numpy数组乘法元素吗?

标签: python list numpy


【解决方案1】:

使用 itertools.product 我们可以将这些作为tuples 获取,然后使用' '.join 创建str

from itertools import product

list_1 = ['average', 'reasonable'] 
list_2 = ['fiddle', 'frolic']
list_n = ['etc', 'vash']

a = [(x, y, z) for x, y, z in product(list_1, list_2, list_n)]
a = list(map(' '.join, a))
# ['average fiddle etc', 'average fiddle vash', 'average frolic etc', 'average frolic vash', 'reasonable fiddle etc', 'reasonable fiddle vash', 'reasonable frolic etc', 'reasonable frolic vash']

【讨论】:

    【解决方案2】:

    如果你必须用列表来做:

    In [86]: list_1 = ['average', 'reasonable'] 
        ...: list_2 = ['fiddle', 'frolic']
    In [87]: arr1 = np.array(list_1, object)
    In [88]: arr2 = np.array(list_2, object)
    In [89]: np.add.outer(arr1, arr2)
    Out[89]: 
    array([['averagefiddle', 'averagefrolic'],
           ['reasonablefiddle', 'reasonablefrolic']], dtype=object)
    

    通过创建对象数组,而不是字符串 dtype,我强制 add ufunc 使用 Python 字符串的 + 方法。正如@Sandeep 的回答所示,字符串添加是一个连接。字符串乘法是一种复制。

    还有第三个数组:

    In [90]: arr3 = np.array(['etc', 'etc'], object)
    In [91]: np.add.outer(np.add.outer(arr1, arr2),arr3)
    Out[91]: 
    array([[['averagefiddleetc', 'averagefiddleetc'],
            ['averagefrolicetc', 'averagefrolicetc']],
    
           [['reasonablefiddleetc', 'reasonablefiddleetc'],
            ['reasonablefrolicetc', 'reasonablefrolicetc']]], dtype=object)
    

    我猜你所说的链接操作是什么意思。

    我个人更喜欢@vash 的 itertools 解决方案; numpy 并没有对 Python 的字符串处理增加太多。

    In [105]: [' '.join(x) for x in itertools.product(arr1,arr2,arr3)]
    Out[105]: 
    ['average fiddle etc',
     'average fiddle etc',
     'average frolic etc',
     'average frolic etc',
     'reasonable fiddle etc',
     'reasonable fiddle etc',
     'reasonable frolic etc',
     'reasonable frolic etc']
    

    【讨论】:

    • 我会让你弄清楚如何添加空格 :) 通常我们会在字符串之间用join 得到空格。 ' '.join(['one', 'two'])'one'+'two''one'*2 没有空格。
    • 感谢您的评论,我喜欢您使用的列表理解行,会记住这一点
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多